2012-05-20 4 views
0

Название может быть немного запутанным, поэтому позвольте мне объяснить. Я пытаюсь написать простую оболочку, чтобы практиковать свое программирование. У меня есть команда get, fork, exec loop. Однако, когда я нажимаю CTRL-C, пока дочерний процесс все еще выполняется, моя оболочка завершает работу вместо дочернего процесса (но дочерний процесс будет работать). Вот основная функция:Как передавать сигналы дочернему процессу

int main() 
{ 
    dynarray *args; /* pointer to a dynamic array */ 
    int bytes_read; 
    size_t nbytes = 0; 
    char *command; 
    pid_t pid; 
    printf("Enter command: "); 
    while ((bytes_read = getline(&command, &nbytes, stdin)) != -1) { 
     if (bytes_read == -1) { 
      perror("getline"); 
      exit(EXIT_FAILURE); 
     } 
     pid = fork(); 
     if (pid == -1) { 
      perror("fork"); 
      exit(EXIT_FAILURE); 
     } 
     else if (pid == 0) { /* child process */ 
      args = newdynarray(); 
      char *arg = strtok(command, " \n"); 
      while (arg != NULL) { 
       addstring(args, arg); 
       arg = strtok(NULL, " \n"); 
      } 
      if (args->nval == 0) { 
       freedynarray(args); 
       continue; 
      } 

      addstring(args, NULL); 
      char *fullpath = find_executable(args->strings[0]); 
      if (fullpath == NULL) { 
       fprintf(stderr, "Couldn't find executable: %s\n", command); 
       exit(EXIT_FAILURE); 
      } 
      if (execv(fullpath, args->strings) == -1) { 
       perror("execv"); 
       exit(EXIT_FAILURE); 
      } 
     } else { 
      int status; 
      waitpid(pid, &status, 0); 
     } 
     printf("Enter command: "); 
    } 
    return 0; 
} 

У меня не было других частей, потому что я не думаю, что они актуальны. Как я могу заставить мой дочерний процесс улавливать все входные данные из stdin до тех пор, пока он не завершится?

ответ

0

How can I make my child process catch all the input from stdin until it terminates? Сигналы, сгенерированные с помощью клавиш stdin (таких как управление C), будут отправлены последнему процессу для использования stdin, поэтому вы ничего не сможете сделать, если не можете заставить вашего ребенка использовать этот путь.

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

1

Вы можете зарегистрировать обработчик сигнала для SIGINT в своем родительском процессе и использовать kill(2) для отправки сигнала дочернему процессу, PID которого вы должны где-то хранить.

Смежные вопросы