Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Cmd не ждёт завершения программы

Написал я тут программу на голом WINAPI, хотел её использовать в bat файлах, да вот только cmd не ждёт завершения программы, а пишет приглашение ввода снова, и вывод программы налезает на него.
Вопрос таков: как заставить командную строку ждать завершения программы? Может есть какая-то _специальная_функция_ для этого?

Добавлено через 19 минут
А в BAT файлах ждёт... Ну ладно, мне этого хватит
Ответ: Есть команда start, там можно указать, нужно ли ждать завершения или нет.
Вопрос: Семафоры (как заставить клиента ждать?)

1 программа (сервер): создаем разделяемую память и записываем 12345.6789
2 программа (клиент): подключается к разделяемой памяти, выводит число, отключается от разделяемой памяти.

Без семафоров всё работает отлично (запускам программу #1 потом #2 и всё ОК), но теперь нужно добавить ещё пару условий:
1) Программа #1 помещает число в раздел. память и устанавливает семафор
2) Программа #2 ждёт когда установится семафор и потом выводит число записанное сервером в разделяемую память.
Прог-а должна находится в режиме ожидания пока не изменится значение семафора.

Когда идет гонка между процессами созданными fork'ами в одной программе за разделяемыми данными - там всё понятно и легко организуется.
Но когда процессы запускаются в ручную, то как-то уже трудновато. Пытался организовать подобное с клиентом, что он не может прочитать пока сервер записывает данные, но безуспешно.

Правильно ли сделан первый пункт?
Как заставить клиента ждать (нужно допилить код), ибо даже не понятно как присоединиться к семафору и вообще возможно ли?!

СЕРВЕР
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <unistd.h>
#include "interproccomm.h" // Межпроцессорное взаимодействие (shm.h, sem.h и ф-и SharedMemory...)
 
#define SHM_KEY 3333
#define SEM_KEY 4444
 
union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};
 
int main(int argc, char const *argv[])
{
    union semun arg;
    struct sembuf lockRes = {0, -1, 0}; // блокировка ресурка
    struct sembuf relRes = {0, 1, 0}; // освобождение ресурса
    // Создаем семафор для синхронизации работы с разделяемой памятью
    int semid = semget(SEM_KEY, 1, IPC_CREAT | 0666);
    // Устанавливается в семафоре #0 (Контроллер ресурса) значение "1"
    arg.val = 1;
    semctl(semid, 0, SETVAL, arg);
 
    int shmid = SharedMemoryCreate(SHM_KEY, sizeof(long double));
    long double *shm = SharedMemoryAttach(shmid);
 
    // Заблокируем разделяемую память
    if ((semop(semid, &lockRes, 1)) == -1)
    {
        error_msg("Lock failed!", 555); // error_msg(сообщение_об_ошибке, код_ошибки);
    }
 
    *shm = 12345.6789;
    
    // Освободим разделяемую память
    if ((semop(semid, &relRes, 1)) == -1)
    {
        error_msg("Unlock failed!", 666);
    }
 
    // Даем клиенту время воспользоваться данными из разделяемой памяти до их удаления
    fgetc(stdin);
    SharedMemoryDisconnect(shm);
    SharedMemoryDelete(shmid);
    
    // Удалим семафор
    if (semctl(semid, 0, IPC_RMID) < 0)
    {
        error_msg("Can't delete semaphore!", 777);
    }
    return 0;
}
КЛИЕНТ (без семафоров)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <unistd.h>
#include "interproccomm.h"
 
#define SHM_KEY 3333
#define SEM_KEY 4444
 
int main(int argc, char const *argv[])
{
    int shmid = SharedMemoryConnect(SHM_KEY, sizeof(long double));
    long double *shm = SharedMemoryAttach(shmid);
 
    fprintf(stdout, "Resutl: %.11Lf\n", *shm);
 
    SharedMemoryDisconnect(shm);
    fgetc(stdin);
    return 0;
}


Добавлено через 3 минуты
P.s. На ф-и SharedMemory... не обращайте внимание. Внутри них обычное создание, удаление, присоединение к сущ-ей SM, отсоединение и "атач". Они работают правильно.
Ответ: gng, спасибо, но я уже разобрался вчера.
Просто подключался уже к существующему
C
1
int semid = semget(SEM_KEY, 0, 0666);
И не удалял его по завершению работы с ним. А Lock и Unlock делал подобно серверному.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include "interproccomm.h" // Межпроцессорное взаимодействие (shm.h, sem.h и ф-и SharedMemory...)
 
#define VAR_T long double // тип переменной
#define SHM_KEY 3333
#define SEM_KEY 4444
#define SIZE 1
 
union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};
 
struct sembuf lockRes = {0, -1, 0}; // блокировка ресурка
struct sembuf relRes = {0, 1, 0}; // освобождение ресурса
 
int main(int argc, char const *argv[])
{
    fputs("=====[ Server's try creating ]=====\n", stdout);
    union semun arg;
    // Создаем семафор для синхронизации работы с разделяемой памятью
    int semid = SemaphoreCreate(SEM_KEY, 1);
    // Устанавливается в семафоре #0 (Контроллер ресурса) значение "1"
    arg.val = 1;
    semctl(semid, 0, SETVAL, arg);
    fputs(" > Semaphore created.\n", stdout);
    // Создадим разделяемую память
    int shmid = SharedMemoryCreate(SHM_KEY, SIZE * sizeof(VAR_T));
    VAR_T *shm = SharedMemoryAttach(shmid);
    fputs(" > Shared Memory created.\n", stdout);
    fputs("=====[ Server created ]=====\n\n", stdout);
    fputs("Enter any key for start...\n", stdout);
    fgetc(stdin);
 
    // Заблокируем разделяемую память
    if ((semop(semid, &lockRes, 1)) == -1)
        error_msg("Lock failed!", 555);
    else
        fputs("> Semaphore lock\n", stdout);
    sleep(10);
    // Запишем данные в разделяемую память
    *shm = 666.666;
    // Освободим разделяемую память
    if ((semop(semid, &relRes, 1)) == -1)
        error_msg("Unlock failed!", 666);
    else 
        fputs("> Semaphore unlock\n", stdout);
    
    fputs("\n=====[ Server try delete ]=====\n", stdout);
    fputs("Enter any key for delete...\n", stdout);
    fgetc(stdin);
    SharedMemoryDisconnect(shm);
    fputs(" > Shared Memory disconnected.\n", stdout);
    SharedMemoryDelete(shmid);
    fputs(" > Shared Memory deleted.\n", stdout);
    SemaphoreDelete(semid);
    fputs(" > Semaphore deleted.\n", stdout);
    fputs("=====[ Server deleted ]=====\n", stdout);
    return 0;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include "interproccomm.h"
 
#define VAR_T long double // Your type varivable
#define SHM_KEY 3333
#define SEM_KEY 4444
#define SIZE 1
 
union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};
 
struct sembuf lockRes = {0, -1, 0}; // блокировка ресурка
struct sembuf relRes = {0, 1, 0}; // освобождение ресурса
 
int main(int argc, char const *argv[])
{
    fputs("=====[ Client try connect ]=====\n", stdout);
    // Подключаемся к существующему семафору для синхронизации работы с разделяемой памятью
    int semid = SemaphoreConnect(SEM_KEY);
    fputs(" > Semaphore connected.\n", stdout);
    int shmid = SharedMemoryConnect(SHM_KEY, SIZE * sizeof(VAR_T));
    VAR_T *shm = SharedMemoryAttach(shmid);
    fputs(" > Shared Memory connected.\n", stdout);
    fputs("=====[ Client connected ]=====\n\n", stdout);
    fputs("Enter any key for start...\n", stdout);
    fgetc(stdin);
 
    fputs(" Waiting for access to data...\n\n", stdout);
    // Заблокируем разделяемую память
    if ((semop(semid, &lockRes, 1)) == -1)
        error_msg("Lock failed!", 555);
    else
        fputs("-----( Lock )-----\n", stdout);
    // Выведем значение из разделяемого сегмента памяти
    fprintf(stdout, " Data from Shared Memory: %.11Lf\n", *shm);
    // Освободим разделяемую память
    if ((semop(semid, &relRes, 1)) == -1)
        error_msg("Unlock failed!", 666);
    else 
        fputs("-----( Unlock )-----\n", stdout);
    
    fputs("\n=====[ Client try disconnect ]=====\n", stdout);
    fputs("Enter any key for disconnect...\n", stdout);
    fgetc(stdin);
    SharedMemoryDisconnect(shm);
    fputs(" > Shared Memory disconnected.\n", stdout);
    fputs("=====[ Client disconnected ]=====\n", stdout);
    return 0;
}
Вопрос: Как заставить сервера ждать? Java Sockets

Как после отключение последнего клиента заставить сервера ждать новых подключений и не отключиться?
Ответ: Для того чтобы ждать новых подключений нужно вызывать . Вне зависимости, есть ли подключенные клиенты или нет.
Просто вызываете accept - и поток будет ждать подключения.
Вопрос: Можно ли ждать завершения одновременно сразу нескольких потоков?

Можно ли ждать завершения одновременно сразу нескольких потоков или выставления нескольких эвентов ?
Нечто вроде аналога WaitForMultiplyObjects().

В псевдокоде нечто вроде:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import threading
import time
 
def thread_function(i):
    time.sleep(i)
 
def main():
    threads = []
    for i in range(2):
        thread = threading.Thread(target=thread_function, args=(i))
        threads.append(thread)
 
    index_of_thread = wait_one_of_threads(threads) #  и wait_all_threads(threads)
 
    print(index_of_thread, "finished first...")
 
if __name__ == '__main__':
    main()
Ответ: Чтобы как-то подытожить с потоками
В моём случае в главном (родительском, том что обозначен как main) процессе 4 потока:
1. Главный поток - main,
2. Поток, явно нами созданный - creator,
3. Поток, созданный реализацией ProcessPoolExecutor, для обеспечения взаимодействия между главным и, создаваемыми PoolExecutor'ом, рабочими процессами (из него, в частности, вызываются колбеки),
4. Наконец, последний, создан реализацией multiprocessing.Queue. Queue используется внутри ProcessPoolExecutor'а для складирования результатов работы дочерних процессов.

В дочерних процессах по одному потоку.
Вопрос: Как заставить программу использовать больше ресурсов процессора?



Возможно ли вообще, в принципе, заставить программу использовать больше ресурсов процессора? Как видите, она использует только 13%, остальные 87 расходуются на бездействие системы. Запускал, если что, из среды, в режиме debug. (может из-за этого так?)


Вот код, кому интересно (только не смейтесь).
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <fstream>
#include <cmath>
#include <iostream>
#include <ctime>
#include <iomanip>
#include <vector>
 
using namespace std;
 
ifstream in ("input.txt");
ofstream out ("output.txt");
ofstream lout ("log.txt");
 
void showTime (double tiks) {
  int sec = tiks / CLOCKS_PER_SEC;
  int _min = sec / 60;
  int hour = _min / 60;
  sec = sec % 60;
  _min = _min % 60;
  lout <<
        "Time: " <<
        hour << ':' <<
        _min << ':' <<
        sec
  << endl;
}
 
 
int main() {
  vector<double> sinus;
  sinus.push_back(0);
  vector<int> slag;
  double slagaemoe_ans[20] = {};
  for (int i = 1; i <= 181; i++) {
    if (sin(i) > 0) {
      sinus.push_back(sin(i));
      slag.push_back(i);
    }
  }
  double sum = 0;
  for (int i1 = 1; i1 < 92; i1++) {
    lout << "i1 " << i1 << ' ';
    showTime((double)clock());
    lout << "-----------------" << endl;
    for (int i2 = i1; i2 < 92; i2++) {
      lout << "i2 " << i2 << ' ';
      showTime((double)clock());
      lout << "-----------------" << endl;
      for (int i3 = i2; i3 < 92; i3++) {
        lout << "i3 " << i3 << ' ';
        showTime((double)clock());
        lout << "-----------------" << endl;
        for (int i4 = i3; i4 < 92; i4++) {
          lout << "i4 " << i4 << ' ';
          showTime((double)clock());
          lout << "-----------------" << endl;
          for (int i5 = i4; i5 < 92; i5++) {
            lout << "i5 " << i5 << ' ';
            showTime((double)clock());
            lout << "-----------------" << endl;
            for (int i6 = i5; i6 < 92; i6++) {
              for (int i7 = i6; i7 < 92; i7++) {
                for (int i8 = i7; i8 < 92; i8++) {
                  for (int i9 = i8; i9 < 92; i9++) {
                    for (int i10 = i9; i10 < 92; i10++) {
                      for (int i11 = i10; i11 < 92; i11++) {
                        for (int i12 = i11; i12 < 92; i12++) {
                          for (int i13 = i12; i13 < 92; i13++) {
                            for (int i14 = i13; i14 < 92; i14++) {
                              for (int i15 = i14; i15 < 92; i15++) {
                                for (int i16 = i15; i16 < 92; i16++) {
                                  for (int i17 = i16; i17 < 92; i17++) {
                                    for (int i18 = i17; i18 < 92; i18++) {
                                      for (int i19 = i18; i19 < 92; i19++) {
                                        for (int i20 = i19; i20 < 92; i20++) {
                                          if ((i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10
                                               + i11 + i12 + i13 + i14 + i15 + i16 + i17 + i18 + i19 + i20 == 200) &&
                                              (sinus[i1] + sinus[i2] + sinus[i3] + sinus[i4] + sinus[i5] + sinus[i6] + sinus[i7] + sinus[i8] + sinus[i9] + sinus[i10]
                                              + sinus[i11] + sinus[i12] + sinus[i13] + sinus[i14] + sinus[i15] + sinus[i16] + sinus[i17] + sinus[i18] + sinus[i19] + sinus[i20]) > sum) {
                                                sum = sinus[i1] + sinus[i2] + sinus[i3] + sinus[i4] + sinus[i5] + sinus[i6] + sinus[i7] + sinus[i8] + sinus[i9] + sinus[i10]
                                              + sinus[i11] + sinus[i12] + sinus[i13] + sinus[i14] + sinus[i15] + sinus[i16] + sinus[i17] + sinus[i18] + sinus[i19] + sinus[i20];
                                              slagaemoe_ans[0] = i1;
                                              slagaemoe_ans[1] = i2;
                                              slagaemoe_ans[2] = i3;
                                              slagaemoe_ans[3] = i4;
                                              slagaemoe_ans[4] = i5;
                                              slagaemoe_ans[5] = i6;
                                              slagaemoe_ans[6] = i7;
                                              slagaemoe_ans[7] = i8;
                                              slagaemoe_ans[8] = i9;
                                              slagaemoe_ans[9] = i10;
                                              slagaemoe_ans[10] = i11;
                                              slagaemoe_ans[11] = i12;
                                              slagaemoe_ans[12] = i13;
                                              slagaemoe_ans[13] = i14;
                                              slagaemoe_ans[14] = i15;
                                              slagaemoe_ans[15] = i16;
                                              slagaemoe_ans[16] = i17;
                                              slagaemoe_ans[17] = i18;
                                              slagaemoe_ans[18] = i19;
                                              slagaemoe_ans[19] = i20;
                                              out << sum << endl;
                                              for (int i = 0; i < 20; i++) {
                                                out << slagaemoe_ans[i] << ' ' << endl;
                                              } out << "--------------------" << endl;
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  out << sum << endl;
  for (int i = 0; i < 20; i++) {
    out << slagaemoe_ans[i] << ' ' << endl;
  }
  cin.get();
  return 0;
}
Ответ: Вероятно, у тебя процессор 8-ядерный либо "8-поточный" (как любят говорить маркетологи). В этом случае полная загрузка одного процессора соответствует 12.5% (ну или округлённо 13%) от общей загрузки, выраженной в маркетинговых попугаях. Т.е. загрузка в 100% маркетинговых попугаев соответствует полной загрузке всех ядер

Добавлено через 2 минуты
Собственно, я уже пояснял про это
Вопрос: Как заставить программу находить в строке слово

Как заставить программу находить в строке слово?
Т.е мы пишем "Привет халк,я люблю зеленый цвет";
Если в строке есть "Зелёный",то он дальше не читает.
И он выводит нам "Привет халк,я люблю зелёный ". Никак понять не могу. Помогите пожалуйста!
Ответ: getline() считывает всё предложение.
Вопрос: Программа ждет 5 секунд ввода номера строки, если ввод не происходит, выводится весь файл

программа ждет 5 секунд ввода номера строки,если ввод не происходит, выводится весь файл.
Может возникнуть проблема,когда между

Код C
1
2
3
if (scanf("%d",&line_no) != 0)
        {       
             signal(SIGALRM, SIG_IGN);
сканфом и блокироковкой сигнала все-таки сигнал пройдет и все выведется. Насколько я поняла, это проблема из параллельного программирования. Из-за чего это возникает в общем случае, а не на примере сканфа в этой программе?

Код C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include<sys/types.h>
 #include <string.h>
 #include<signal.h>
 
 #define BUFSIZE 257
 
    off_t displ[100];
    char* str;
        int fd1, fd2, i = 1, j = 0, line_no, line_ln[100];
        char c, buf[BUFSIZE];
        static char err_msg[32] = "Input file - ";
        ssize_t readed;
    struct sigaction act;
    sigset_t set;
void  ALARMhandler(int sig)
{
        lseek(fd2, SEEK_SET, SEEK_SET);
        while((readed = read(fd2, buf, BUFSIZE)) > 0)
        write(STDOUT_FILENO, buf, readed);
        exit(0);
}
 
int main(int argc, char *argv[])
 {
    
     if ((fd1 = open("/dev/tty", O_RDONLY | O_NONBLOCK)) == -1) 
     {
         perror("/dev/tty");
         exit(1);
     }
 
     if ((fd2 = open(argv[1], O_RDONLY)) == -1) 
     {
         perror(strcat(err_msg, argv[1]));
         exit(1);
     }
     displ[1] = 0;
 
     while(read(fd2, &c, 1))
         if( c == '\n' ) 
        {
            j++;
            line_ln[i] = j;
            i++;
            displ[i] = lseek(fd2, 0, 1);
            j = 0;
                 }
         else
             j++;
 
 
     while (printf("you have 5 seconds to enter a line number\n"))
    {    
        signal(SIGALRM, ALARMhandler);    
            alarm(5);
        sigemptyset(&set);             
        memset(&act, 0, sizeof(act));   
        act.sa_handler = ALARMhandler;
        act.sa_mask = set;
            if (scanf("%d",&line_no) != 0)
        {       
             signal(SIGALRM, SIG_IGN);
            exit(0);
                if(line_no == 0)
                exit(0);            
                if ((line_no>=i)||(line_no<0))
                {
                            fprintf(stderr, "Bad Line Number\n");
                    continue;   
                }
                else
                {
                            lseek(fd2, displ[line_no], 0);
                            if(read(fd2, buf, line_ln[line_no]))
                            write(STDOUT_FILENO, buf, line_ln[line_no]);
                        }
            }
 
        }
    }
Ответ:

Return Value
...
EOF is also returned if a read error occurs, in which case the error
indicator for the stream (see ferror(3)) is set, and errno is set indicate
the error.
...
EINTR
The read operation was interrupted by a signal; see signal(7).
Другими словами, многие функции ввода-вывода выдают EINTR в том случае, если их прервали сигналом. В данном случае нужна дополнительная ветка для проверки результата на равенству EOF'у и дальнейшая проверка errno. К параллельному программированию отношения не имеет. Если я правильно понял вопрос
Вопрос: По нажатию Ctrl+А завершить работу программы и выполнить команду dir

Помогите пожалуйста, написать программу на Turbo Assembler которая после нажатия [Ctrl ] + [А] завершить работу программы и выполнить команду DOS : dir.
Ответ:
Сообщение от SWATs
TASM выдает ряд ошибок
скачай фасм
Вопрос: Составить программу с использованием команд CALL, RET, LOOP, JMP и пары условий Jxx

Здравствуйте. В общем, дали задание: составить программу с использованием команд CALL, RET, LOOP, JMP и пары условий Jxx. И чтоб все в одной задаче.
На какую тему можно сделать задачу?
Ответ: Думаю, таблицу квадратов\кубов сделаю.
Всем спасибо за ответы.
Вопрос: Задержка в программе

как заставить прогу ждать допустим 30 сек(т.е. не идти дальше по кодув течении определённого времени)
(не спать, а ждать, поэтому thread.sleep не подходит)
Ответ:
Сообщение от little hacker
как заставить прогу ждать допустим 30 сек
Варианта (правильных) всего два, ятд.
1. Thread.Sleep(...) в отдельном потоке.
2. Отдельный поток и использование примитивов межпотоковой сигнализации (EventWaitHandle и его наследники).