2015-10-19 2 views
0

Это то, что происходит в моем обработчике сигналов. Также signal_flag является глобальной переменной.Обработчики сигналов в проекте мини-оболочки

volatile sig_atomic_t signal_flag = 0; 
void sig_handler(int signo) { 
    if (signo == SIGTSTP) { 
     signal_flag = 1; 
    } 
} 

Это условие, которое возникает, если моя функция fork() работает как предполагается. У меня есть спящий режим, равный 5, поэтому у меня достаточно времени, чтобы нажать CTRL + Z после команды, которую я дам в качестве ввода, и приостановить процесс.

 pid_t child_pid = fork(); 
     int status; 
     //GOT A SIGNAL. 
     if (signal(SIGTSTP, sig_handler) != SIG_ERR) { 
      signal(SIGTSTP, SIG_IGN); 
      kill(child_pid, SIG_IGN); 
      insert_suspended_process(child_pid, ACTIVE); 
      //_exit(EXIT_SUCCESS); 
     } 
     if (child_pid < 0) { 
      fprintf(stderr, "execute: fork failed.\n"); 
      exit(EXIT_FAILURE); 
     } 
     if (child_pid == 0) { 
      /* child process. */ 
      //print_child_messages(); 
      char bin[512]; 
      strcpy(bin, command[0]); 
      //strcat(bin, command[0]); 

      if (bars > 0) { 
       //Houston, we have pipes, I REPEAT, WE HAVE PIPES! 
       int pipefd[2], status; 
       pid_t cpid; 
       if (pipe(pipefd) == -1) { 
        fprintf(stderr, "execute: pipe failed.\n"); 
        exit(EXIT_FAILURE); 
       } 
       cpid = fork(); 

       pipe(pipefd); 

      } 
      sleep(3); 


      //executing... 
      execvp(bin, command); 
      _exit(EXIT_SUCCESS);  //safer than exit(). 
     } 
     else { 
      /* parent process. */ 
      //print_parent_messages(child_pid); 
      //signal(SIGTSTP, SIG_IGN); 


      waitpid(child_pid, NULL, 0); 

     } 

Делаю оболочку как часть домашней работы, и я просил, чтобы обрабатывать сигнал SIGTSTP таким образом, что, когда пользователь нажимает CTRL + Z моя оболочка будет приостановить текущий процесс (я есть set sleep (3), поэтому я могу приостановить даже простой процесс ls -al) Моя проблема заключается в том, что мой код добавляет процесс с этим pid в мой список через функцию insert_suspended_process(pid_t), но это происходит без меня, нажимая на сигнал CTRL + Z. Любые мысли или вопросы?

+0

Вы должны были объявить 'volatile sig_atomic_t signal_flag = 0;'; также скомпилируйте все предупреждения и информацию об отладке ('gcc -Wall -Wextra -g'), ** используйте отладчик ** (' gdb'), а также 'strace' &' valgrind' –

ответ

0

Вы, кажется, не проверяете результат fork() в if (i == 12). Также установка обработчика сигнала ПОСЛЕ развития вилки - это проблема, ожидающая, что это произойдет.

+0

Но чтобы быть в этой части кода, то fork() возвращается 0. Вот почему я в дочернем процессе. То, что я хочу сделать, это приостановить процесс с помощью CTRL + Z, не останавливая мою собственную оболочку. – Jack