Приостановить и возобновить процесс с помощью сигналов - PullRequest
0 голосов
/ 08 мая 2020

У меня здесь две проблемы / вопросы!

1) Я пытался поймать CTRL+Z и обработать его, но ничего не произошло !!

2) как я могу протестировать SIGCONT? (у него нет ярлыка типа CTRL + ..)

Что-то не так с моим кодом? Это мой код ниже:

void sigstop()
{  
   printf(" Suspended\n");
}

void sigcont()
{  
   printf(" Its Back\n");
}

void sigint()
{ 
    printf(" Interrupt\n");
    //exit(0);
}

int main(int argc, char **argv){ 
    printf("Starting the program\n");
    signal(SIGSTOP,sigstop);
    signal(SIGCONT,sigcont);
    signal(SIGINT, sigint);
    while(1) {
        sleep(2);
    }   
    return 0;
}

1 Ответ

0 голосов
/ 09 мая 2020

1) Я пытался поймать CTRL + Z и обработать его, но ничего не произошло !!

CTRL + Z отправляет SIGTSTP. Поэтому вам нужно настроить обработчик для SIGTSTP (не SIGSTOP). Сигналы SIGSTOP и SIGKILL не могут быть пойманы или обработаны; поэтому ваш обработчик для SIGSTOP будет проигнорирован.

2) как я могу проверить SIGCONT? (у него нет ярлыка, такого как CTRL + ..)

Оболочки обычно имеют встроенную команду под названием fg. Итак, как только вы приостановите процесс с помощью CTRL + Z , вы сможете отправить SIGCONT через fg. Но вы всегда можете использовать встроенную оболочку kill (или команду kill) для отправки желаемого сигнала вашему процессу.


Пара других проблем в вашем коде:

  1. функция сигнала должна соответствовать сигналу void func(int sig) { .. }. Поэтому вам нужно исправить свои функции сигналов.

  2. printf не asyn c -signal-safe , и поэтому его нельзя безопасно вызывать из обработчик сигналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...