Замена SIGCHLD для Windows - PullRequest
       11

Замена SIGCHLD для Windows

3 голосов
/ 09 февраля 2012

Я хотел бы иметь функциональность SIGCHLD в Windows (то есть уведомлять родительский процесс о смерти ребенка). Я знаю, что в Windows API нет эквивалента SIGCHLD, но я хотел бы знать, каков общий метод реализации этого с Windows. Я уверен, что это проблема, с которой разработчики Windows сталкиваются довольно часто.

Единственное решение, которое я могу придумать сейчас, - опросить детей, чтобы узнать, живы ли они.

Примечание: мое приложение является однопоточным, и я хотел бы сохранить его таким, если это возможно. В приложении есть неблокирующая петля событий (используется select ()).

Ответы [ 2 ]

5 голосов
/ 09 февраля 2012

Если вы порождаете эти дочерние процессы самостоятельно, вы можете использовать Объекты заданий , они могут уведомлять вас о завершении процесса, являющегося частью вашей работы.1006 * и поймать JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS или JOB_OBJECT_MSG_EXIT_PROCESS.

4 голосов
/ 09 февраля 2012

Я не знаю, является ли это лучшим способом, но это, безусловно, способ.

Я предполагаю, что вы создаете процесс с CreateProcess.Это возвращает PROCESS_INFORMATION структуру, которая содержит член hProcess.Это дескриптор дочернего процесса, который вы создали.

Здесь вы можете подождать этот дескриптор с помощью WaitOnSingleObject, который будет блокировать до тех пор, пока данный дескриптор не будет сигнализирован (хотя это займет времяВы бы предпочли сделать это неблокирующим - это самый близкий эквивалент select, который вы получите).

Если вы идете по многопоточному маршруту, то вы можете ждать в отдельном потоке, а затем, когда пройдет WaitOnSingleObject, вы можете соответствующим образом уведомить рабочий поток в родительском процессе.

В однопоточном стиле вы просто будете опрашивать дескриптор в цикле, если будете использовать семантику в стиле select.

Если у вас есть несколько дочерних объектов для ожидания (задановы уже используете select), вы можете рассмотреть WaitForMultipleObjects - если это подходящая модель для вашего кода.

...