Как узнать, собраны ли все процессы в группе процессов? ⇐ Linux
-
Anonymous
Как узнать, собраны ли все процессы в группе процессов?
Я изучаю сигналы и пишу простую программу-оболочку. Я столкнулся с проблемой: оболочке нужно дождаться завершения приоритетного задания, которое может состоять из нескольких процессов. Кажется, мне нужно использовать waitpid, чтобы «ждать» все процессы в группе процессов задания. Сначала у меня вышел следующий код:
pid_t pid; while ((pid = waitpid(-pgid, NULL, 0)) > 0) { // Поработай немного } если (ошибка == ECHILD) { // Теперь мы знаем, что все процессы в группе завершились } Но потом я начал подозревать: поскольку идентификатор процесса может быть повторно использован после его завершения, и я думаю, что то же самое можно сделать и с идентификатором группы процессов, есть вероятность, что после того, как последний процесс в группе будет wait обрабатывается циклом while, и перед началом следующего цикла создается новый процесс, идентификатор группы процессов которого также равен pgid. В этом случае цикл продолжит ожидать нового процесса, хотя на самом деле он не принадлежит к предыдущей группе. На самом деле, я думаю, что использование waitpid не может решить проблему. После последнего waitpid мне нужно использовать его еще раз, чтобы проверить, есть ли еще процессы с тем же pgid. Между этими двумя вызовами waitpid могут возникнуть новые процессы с тем же самым pgid.
Позже, заметив, что дочерний поджнец используется для работы с потомками и внуками, мне пришла в голову идея, что я могу использовать процесс A исключительно для работы на переднем плане, а процесс B - для работать со всеми остальными процессами, чтобы любые новые процессы (принадлежащие процессу B) не мешали waitpid процесса A. Я до сих пор не знаю, осуществим ли этот метод и возникнут ли дальнейшие проблемы.
Мои вопросы: 1) есть ли простой способ решить проблему? 2) или какой-то сложный метод? 3) или мое беспокойство по поводу проблемы излишне? 4) или проблемы на самом деле не будет?
Спасибо.
Я изучаю сигналы и пишу простую программу-оболочку. Я столкнулся с проблемой: оболочке нужно дождаться завершения приоритетного задания, которое может состоять из нескольких процессов. Кажется, мне нужно использовать waitpid, чтобы «ждать» все процессы в группе процессов задания. Сначала у меня вышел следующий код:
pid_t pid; while ((pid = waitpid(-pgid, NULL, 0)) > 0) { // Поработай немного } если (ошибка == ECHILD) { // Теперь мы знаем, что все процессы в группе завершились } Но потом я начал подозревать: поскольку идентификатор процесса может быть повторно использован после его завершения, и я думаю, что то же самое можно сделать и с идентификатором группы процессов, есть вероятность, что после того, как последний процесс в группе будет wait обрабатывается циклом while, и перед началом следующего цикла создается новый процесс, идентификатор группы процессов которого также равен pgid. В этом случае цикл продолжит ожидать нового процесса, хотя на самом деле он не принадлежит к предыдущей группе. На самом деле, я думаю, что использование waitpid не может решить проблему. После последнего waitpid мне нужно использовать его еще раз, чтобы проверить, есть ли еще процессы с тем же pgid. Между этими двумя вызовами waitpid могут возникнуть новые процессы с тем же самым pgid.
Позже, заметив, что дочерний поджнец используется для работы с потомками и внуками, мне пришла в голову идея, что я могу использовать процесс A исключительно для работы на переднем плане, а процесс B - для работать со всеми остальными процессами, чтобы любые новые процессы (принадлежащие процессу B) не мешали waitpid процесса A. Я до сих пор не знаю, осуществим ли этот метод и возникнут ли дальнейшие проблемы.
Мои вопросы: 1) есть ли простой способ решить проблему? 2) или какой-то сложный метод? 3) или мое беспокойство по поводу проблемы излишне? 4) или проблемы на самом деле не будет?
Спасибо.
Мобильная версия