как обрабатывать сигнал Ctrl + Z в мини-оболочке.С - PullRequest
2 голосов
/ 03 февраля 2011

Я пытаюсь приостановить процесс, но он не работает. это часть кода. есть Ctrl + Z и Ctrl + C. Ctrl + C работает. Я не могу понять, почему с Z это не работает. (фактический код):

//ctrl+Z
void sigstop(int p){
    signal(SIGTSTP,&sigstop);
    kill(my_pid,SIGSTOP);

    fflush(stdout);
}

// Ctrl+C
void sigkill(int p){
    signal(SIGINT,&sigkill);  
    kill(my_pid,SIGKILL);

    fflush(stdout);
}

Код в основном методе:

...
my_pid = fork();    
if (my_pid == 0) {
    signal(SIGTSTP,&sigstop);      //for Ctrl+Z
    signal(SIGINT,&sigkill);       //for Ctrl+C

    checkCommand();        
    execvp(argv[0], argv);
    exit(getpid());    
}

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Вместо установки обработчиков сигналов для SIGTSTP и SIGINT переведите терминал в необработанный режим с помощью cfmakeraw или tcsetattr. ^ C и ^ Z будут читаться как обычные символы, что должно быть гораздо менее хлопотно.Однако затем вам нужно будет самостоятельно редактировать строки - GNU readline ваш друг там.Для получения дополнительных рекомендаций см. Разделы Реализация оболочки и Управление заданиями в Руководство по библиотеке GNU C .(Вы можете спокойно игнорировать ту часть, в которой он пытается предупредить вас о том, что управление заданиями может не поддерживаться ядром - если кто-то все еще использует одну из этих систем, они сами виноваты в этом.)

0 голосов
/ 05 сентября 2012

Я думаю, что вызов kill () в функции sigkill просто запускает бесконечный рекурсивный цикл, где kill () просто снова вызывает функцию sigkill, которая вызывает kill (), которая снова вызывает функцию sigkill ... и т. Д.Вместо вызова kill () установите глобальную логическую переменную и проверьте ее в своей основной функции.Если эта глобальная логическая переменная установлена, вы просто выходите изящно.

Что-то вроде:

volatile bool gTerminate = false;

void sigkill(int p)
{
    gTerminate = true;
    signal(SIGINT, &sigkill);  
}

int main(...)
{
   //initialization stuff...

   while( !gTerminate )
   {
      //do stuff
   }

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