Как убить родительский процесс и его потомков на Ctrl + C или Ctrl + Z - PullRequest
2 голосов
/ 19 декабря 2011

У меня есть основной процесс в моей программе, который выполняет fork () некоторых дочерних процессов, а затем переходит в бесконечный цикл (также дочерние процессы бесконечны). Теперь я хочу завершить все процессы, закрыть сокет, отсоединить разделяемую память и очистить все подобные вещи при завершении работы программы с помощью Ctrl + C или Ctrl + Z . Я искал в интернете и обнаружил, что могу сделать это, отправив несколько сигналов, таких как SIGSTOP и SIGINT, но я не знаю, как это сделать. Итак, как мне это сделать в моей программе?

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Из-за пределов программы вы можете отправить любому процессу сигнал с помощью команды kill.

По умолчанию kill отправит сигнал SIGTERM, который завершитпроцесс, и освободить свои выделенные ресурсы.Вы можете использовать команду ps, чтобы найти идентификаторы процессов вашей программы.Использование CTRL - C приведет только к завершению родительского процесса.Это не убьет дочерние процессы.Если вы просто разветвили и не выполнили новую программу, тогда все ваши дочерние процессы будут иметь то же имя, что и родительский, что означает, что вы можете использовать команду killall, чтобы завершить их все водин ход.Если вы вошли в систему удаленно, то выход из системы вызовет отправку сигнала SIGHUP всем процессам, которые вы породили во время сеанса, что приведет к их завершению по умолчанию.

Внутри программы естьявляется функцией kill(), которая работает аналогично команде.Идентификаторы процессов вам по-прежнему нужны, поэтому важно, чтобы ваш родительский код запоминал идентификатор дочернего процесса, возвращаемый fork.

0 голосов
/ 19 декабря 2011

Когда ваш процесс жестоко завершается, все ресурсы обязательно освобождаются.

Однако, если вы хотите контролировать поведение (в каком порядке и т. Д., Я не знаю, что), то вам следует установить обработчик сигнала. Смотри sigaction(2).

...