Моя текущая программа создает дочерние процессы и дает им работу (загрузка процессора).Main () сидит там и ждет, пока дочерние процессы отправят данные по каналам (используя select).
Что я хотел сделать, это когда программа обрабатывает данные, я мог нажать CTRL + C, чтобы остановить дочерний процессПроцессы от работы и запроса пользователя, если он хочет выйти или возобновить работу.
Если пользователь хочет выйти, программа завершит все процессы.Если пользователь хочет возобновить работу, он скажет дочерним процессам возобновить вычисления.
У меня уже есть код на месте, но он не совсем работает правильно.
В основном у меня есть signal(SIGINT, pausar);
для обработки SIGINT (CTRL + C).
Это функция pausar ():
void pausar(int signum){
signal(SIGINT, pausar);
int i;
// pid[] contains all the child processes
for(i = 0; i<CORES; i++)
{
kill(pid[i], SIGSTOP);
}
char option[2];
printf("\n Computacao pausada.\n'S' para sair ou 'C' para continuar: ");
scanf("%1s", option);
if (option[0] == 's' || option[0] == 'S') {
printf("A desligar...\n");
//if user wants to quit, kill all the child processes
for(i = 0; i<CORES; i++)
{
kill(pid[i], SIGKILL);
}
exit(0);
}
else
{
printf("[%d] A resumir computacao...\n",getpid());
kill(getpid(), SIGCONT);
//if user wants to resume work, send signal to continue
for(i = 0; i<CORES; i++)
{
kill(pid[i], SIGCONT);
printf("%d resumiu\n", pid[i]);
}
}
}
Проблема в том, что иногда я нажимаю CTRL + C, и в консоли ничего не отображается (но процессы останавливаются, потому что я обращаю внимание на менеджера процессов).Другая проблема заключается в том, что после ввода «C» для возобновления работы я получаю ошибки в select (), и дети никогда не возобновляют работу.