Linux поддерживает механизм ожидания POSIX, определенный в «sys/wait.h». Способы wait, waitid, waitpid могут использоваться для обмена информацией о статусе между родительскими и дочерними процессами, которые были созданы с использованием fork.Какова ближайшая Windows, эквивалентная механизму ожидания POSIX?
Windows не обеспечивает (собственную) поддержку fork или механизма ожидания POSIX. Вместо этого существуют другие доступные средства для развертывания дочерних процессов, то есть CreateProcess.
При переносе Linux приложений, написанных на C или C++ с помощью вилки/ждать Windows, что бы самый правильный родной * способ мониторинга изменения состояния (а именно WEXITED, WSTOPPED, WCONTINUED) дочерних процессов в родительском процессе?
* родной означает использование дополнительных библиотек, фреймворков, программ (таких как cygwin, minGW), которые не поставляются с окнами или предоставляются непосредственно MS в виде среды выполнения.
Edit: В соответствии с просьбой в комментариях я предоставить более подробную информацию о том, что проблема должна быть решена в виде псевдокода:
//creates a new child process that is a copy of the parent (compare
//POSIX fork()) and returns some sort of handle to it.
function spawnChild()
// returns TRUE if called from the master process FALSE otherwise
function master()
// return TRUE if called from a child process FALSE otherwise
function child()
// returns TRUE if child process has finished its work entirely,
// FALSE otherwise.
function completelyFinished()
//sends signal/message "sig" to receive where receiver is a single
//handle or a set of handles to processes that shall receive sig
function sendSignal(sig, receiver)
// terminates the calling process
function exit()
// returns a handle to the sender of signal "sig"
function senderOf(sig)
function masterprocess()
master //contains handle to the master process
children = {} //this is an empty set of handles to child processes
buf[SIZE] //some memory area of SIZE bytes available to master process and all children
FOR i = 0 TO n - 1
//spawn new child process and at its handle to the list of running
//child processes.
children <- children UNION spawnChild()
IF(master())
<logic here>
sendSignal(STARTWORKING, children) //send notification to children
WHILE(signal = wait()) // wait for any child to respond (wait is blocking)
IF signal == IMDONE
<logic here (involving reads/writes to buf)>
sendSignal(STARTWORKING, senderOf(signal))
ELSEIF signal == EXITED
children <- children \ signal.sender //remove sender from list of children
ELSEIF(child())
WHILE(wait() != STARTWORKING);
<logic here (involving reads/writes to buf)>
IF completelyFinished()
sendSignal(EXITED, master)
exit()
ELSE
sendSignal(IMDONE, master)
Процессы Windows не имеют тех же «состояний», что и процессы POSIX. Если вы хотите дождаться завершения процесса, вы можете либо опросить GetExitCodeProcess, либо просто использовать WaitForSingleObject (или один из его родственников) с дескриптором процесса. –
@RogerLipscombe Признавая, что окна, вероятно, не поддерживают эти точные сигналы, я все еще предполагаю, что ther должно быть sth. Связанный. Представьте, что вы разделяете память между процессами (т. Е. С помощью CreateFileMapping). Поэтому, вместо того, чтобы опрос грубой силы для изменений в этой памяти из каждого отдельного процесса (надеюсь) должен быть каким-то образом для любого из связанных процессов, чтобы рассказать другим: «Эй, ребята, я сделал это, пожалуйста, проверьте, важно для вас »или, альтернативно,« Эй, я поставил некоторый запрос в память, пожалуйста, кто-то ответственный процесс и сообщит мне, когда закончите ». – norritt
Итак, вы действительно заинтересованы в обмене между процессами и вообще не заботитесь о сигналах Posix? – usr