Linux вилка, execve - не надо ждать зомби - PullRequest
0 голосов
/ 14 марта 2020

В Linux & C, не будет ли ждать (waitpid) запущенного процесса fork-execve создания зомби? Как правильно (многократно) запускать новую программу без ожидания и без утечек ресурсов? Он также будет запущен из 2-го рабочего потока. Может ли первая программа завершиться первой, если запущенные программы еще не завершены?

Дополнительно: в моем случае у меня есть несколько потоков, которые могут выполнять процессы fork-execve в ЛЮБОЕ ВРЕМЯ и ТО ЖЕ ВРЕМЯ - 1) Некоторые мне нужно подождать для завершения и хочу сообщать о любых кодах ошибок с помощью waitpid 2) Некоторые я не хочу блокировать поток и хотел бы сообщать об ошибках 3) Некоторые я не хочу ждать и не заботится о результате и может запустить после завершения программы

Для # 2, мне нужно создать дополнительный поток, чтобы сделать waitpid? Для # 3, я должен сделать fork-fork-execve, и завершение 1-го форка приведет к тому, что 2-й процесс будет очищен (без zomb ie) отдельно через init?

Дополнительно: я прочитал кратко (не уверен, что я все понимаю) об использовании nohup, double fork, setgpid (0,0), сигнала (SIGCHLD, SIG_IGN). Разве глобальный сигнал (SIGCHLD, SIG_IGN) не имеет слишком много побочных эффектов, таких как наследование (или, может быть, нет) и предотвращение мониторинга других процессов, которые вы хотите ждать? Не будет ли полагаться на init для устранения утечек ресурсов, пока программа продолжает работать (в моем случае недели)?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

В итоге я сохранил массив только из форка-exe c 'pids, которых я не ждал (другие форки-exe c' d pid действительно ждут) и периодически сканировал список, используя waitpid ( pids [xx], & status, WNOHANG)! = 0, что дает мне возможность сообщить о результате и избежать зомби. Я избегал использования глобальных вещей, таких как обработчики сигналов, которые могли бы повлиять на другой код в другом месте.

Это казалось немного грязным.

Я полагаю, что fork-fork-exe c будет альтернативой асинхронно отслеживайте завершение другой программы с помощью первого форка, но затем первый форк нуждается в очистке.

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

0 голосов
/ 14 марта 2020

В Linux & C, не будет ли ждать (waitpid) запущенного процесса fork-execve создания зомби?

Да, они становятся зомби после смерти.

Как правильно (много раз) запускать новую программу без ожидания и без утечек ресурсов? Он также будет запущен из 2-го рабочего потока.

Установить SIGCHLd в SIG_IGN.

Может ли первая программа завершиться первой, если запущенные программы не завершено?

Да, потерянные процессы будут приняты init .

...