Уничтожение детей с родителем

AFAIK сгенерированный интерфейс CIL отличается. При изменении общедоступного участника на свойство, Вы изменяетесь, это - открытый интерфейс и потребность восстановить каждый файл, который использует тот класс. Это не необходимо, если Вы только изменяете реализацию методов get и методов set.

17
задан Thomas Ahle 20 July 2016 в 13:34
поделиться

3 ответа

prctl's PR_SET_DEATHSIG can only be set for this very process that's calling prctl -- not for any other process, including this specific process's children. The way the man page I'm pointing to expresses this is "This value is cleared upon a fork()" -- fork, of course, is the way other processes are spawned (in Linux and any other Unix-y OS).

If you have no control over the code you want to run in subprocesses (as would be the case, essentially, for your gnuchess example), I suggest you first spawn a separate small "monitor" process with the role of keeping track of all of its siblings (your parent process can let the monitor know about those siblings' pids as it spawns them) and sending them killer signals when the common parent dies (the monitor needs to poll for that, waking up every N seconds for some N of your choice to check if the parent's still alive; use select to wait for more info from the parent with a timeout of N seconds, within a loop).

Not trivial, but then such system tasks often aren't. Terminals do it differently (via the concept of a "controlling terminal" for a process group) but of course it's trivial for any child to block THAT off (double forks, nohup, and so on).

6
ответ дан 30 November 2019 в 12:58
поделиться

Я думал, что двойная вилка должна отсоединяться от управляющего терминала. Я не уверен, как вы пытаетесь его использовать.

Это взлом, но вы всегда можете вызвать «ps» и поискать имя процесса, которое вы пытаетесь убить.

1
ответ дан 30 November 2019 в 12:58
поделиться

Я видел очень неприятные способы "очистки" с помощью таких вещей, как ps xuawww | grep myApp | awk '{print $ 1}' | xargs -n1 kill -9

Клиентский процесс, если его открыть, может поймать SIG_PIPE и умереть. Есть много способов сделать это, но на самом деле это зависит от множества факторов. Если вы введете в дочерний элемент какой-то ping-код (ping to parent), вы можете гарантировать, что SIG_PIPE выдается при смерти. Если он поймает его, а должен, он отключится. Вам понадобится двунаправленная связь, чтобы это работало правильно ... или чтобы всегда блокировать клиента как отправителя коммуникации. Если вы не хотите изменять дочерний элемент, проигнорируйте это.

Предполагая, что вы не ожидаете, что настоящий интерпретатор Python будет использовать segfault, вы можете добавить каждый PID в последовательность, а затем убить при выходе. Это должно быть безопасно для выхода и даже для неперехваченных исключений. В Python есть средства для выполнения кода выхода ... для очистки.

Вот еще несколько неприятных вещей: добавьте каждый дочерний PID в файл, включая ваш главный процесс (отдельный файл). Используйте блокировку файлов. Создайте сторожевого пса, который следит за состоянием flock () вашего главного pid. Если он не заблокирован, убейте каждый PID в вашем списке дочерних PID. Запустите тот же код при запуске.

Более неприятный: запишите идентификаторы PID в файлы, как указано выше, затем вызовите свое приложение во вспомогательной оболочке: (./ myMaster; ./killMyChildren)

1
ответ дан 30 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: