Как узнать, ожидает ли родительский процесс дочернего процесса в Linux

843
idelvall

В Linux даны два процесса с известными pIds, и один является родителем другого,

Можно ли узнать, ожидает ли родительский процесс завершения дочернего процесса?

Спасибо

0
посмотрите на исходный код Ipor Sircer 7 лет назад 0
боюсь, это единственный способ idelvall 7 лет назад 0
это может быть немного полезно -> http://stackoverflow.com/questions/801604/how-do-i-tell-what-a-linux-process-is-waiting-for hysterical 7 лет назад 0

1 ответ на вопрос

4
grawity

Проверьте родительский стек ядра и / или wchan («канал ожидания»)

$ ps -o pid,stat,wchan:24,command 1978243 PID STAT WCHAN COMMAND 1978243 Ss wait bash  $ cat /proc/1978243/wchan  do_wait  $ sudo cat /proc/1978243/stack  [<ffffffff8108008d>] do_wait+0x1cd/0x260 [<ffffffff810812ab>] SyS_wait4+0x7b/0xf0 [<ffffffff815f7cf2>] entry_SYSCALL_64_fastpath+0x1a/0xa4 [<ffffffffffffffff>] 0xffffffffffffffff 

Это показывает, находится ли процесс внутри системного вызова ядра - если он показывает waitсистемный вызов, это самый распространенный способ ожидания дочернего процесса.

Обратите внимание, что многие процессы, основанные на событиях , не используют wait()вызов в течение длительного времени - вместо этого они вместо этого ждут poll(), пока не будет получено какое-либо событие (которое может быть или не быть событием SIGCHLD).

Поэтому это работает только с простыми линейными процессами. Для всего остального вам придется проверить исходный код или что-то подобное.

спасибо @grawity, это действительно полезно, я вижу, что две первые команды приводят к инструкции ожидающего стека, но как быть уверенным, что она ожидает дочерний процесс, а не любое другое событие? idelvall 7 лет назад 0
@idelvall: если он вызвал `wait ()`, то он ожидает дочерний процесс, потому что это единственная вещь, syscall `wait ()` _does_. [В отличие от, например, `poll ()`, который будет ожидать произвольных событий на fds.] grawity 7 лет назад 0
прекрасный @ grawity, спасибо за разъяснения idelvall 7 лет назад 0
что если родитель создал несколько дочерних процессов? idelvall 7 лет назад 0

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