отправить SIGINT дочернему процессу - PullRequest
2 голосов
/ 19 ноября 2009

Я пытаюсь создать дочерний процесс, а затем отправить SIGINT дочернему процессу без завершения родительского процесса. Я попробовал это:

pid=fork();
  if (!pid)
  {
      setpgrp();
      cout<<"waiting...\n";
      while(1);
  }
  else
      {
      cout<<"parent";
      wait(NULL);
      }

но когда я нажал C-c, оба процесса были остановлены

Ответы [ 3 ]

7 голосов
/ 19 ноября 2009

Не использовать CTRL-C , это отправляет сигнал всем процессам с одним и тем же управляющим терминалом (т. Е. В одном сеансе). Это то, что setpgid не меняется, хотя я думаю, что для этой цели есть вызов setsid (установить идентификатор сессии).

Самое простое решение - просто нацелиться на конкретный процесс, а не на сеанс. Из командной строки:

kill -INT pid

Из C:

kill (pid, SIGINT);

где pid - идентификатор процесса, на который вы хотите отправить сигнал.

Родитель может получить соответствующий PID из возвращаемого значения из fork(). Если ребенок хочет иметь свой собственный PID, он может позвонить getpid().

4 голосов
/ 19 ноября 2009

Ага, загадка групп процессов и сессий и лидеров групп процессов и лидеров групп сессий снова появляется.

Ваш контроль / C отправил сигнал группе. Вам нужно дать сигнал отдельному pid, поэтому следуйте инструкциям paxdiablo или подайте сигнал («убейте») ребенка от родителя. И не надо ждать! Поместите sleep (1) в цикл или, что еще лучше, один из системных вызовов wait (2).

2 голосов
/ 19 ноября 2009

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

В качестве альтернативы установите для обработчика SIGINT родителя значение SIG_IGN, а для дочернего элемента - SIG_DFL.

...