C 最接近POSIX等待机制的窗口是什么?

C 最接近POSIX等待机制的窗口是什么?,c,windows,monitoring,wait,status,C,Windows,Monitoring,Wait,Status,Linux支持“sys/wait.h”中定义的POSIX等待机制。这些方法可用于在使用创建的父进程和子进程之间交换状态信息 Windows既不提供fork(本机)支持,也不提供POSIX等待机制。相反,spwan子进程还有其他可用的方法,即 在使用Foo/SurvivWindows移植C或C++的Linux应用程序时,什么是最合适的本地方法监视父进程中子进程的状态变化? *本机含义是不使用其他库、框架和程序(如cygwin、minGW),这些库、框架和程序不随windows提供,也不由MS以运行

Linux支持“sys/wait.h”中定义的POSIX等待机制。这些方法可用于在使用创建的父进程和子进程之间交换状态信息

Windows既不提供fork(本机)支持,也不提供POSIX等待机制。相反,spwan子进程还有其他可用的方法,即

在使用Foo/SurvivWindows移植C或C++的Linux应用程序时,什么是最合适的本地方法监视父进程中子进程的状态变化? *本机含义是不使用其他库、框架和程序(如cygwin、minGW),这些库、框架和程序不随windows提供,也不由MS以运行时环境的形式直接提供

编辑:根据评论中的要求,我确实提供了一些关于应该以伪代码的形式解决的问题的更多信息:

//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)
//创建一个新的子进程,该子进程是父进程的副本(比较
//POSIX fork())并返回某种句柄。
函数spawnschild()
//如果从主进程调用,则返回TRUE;否则返回FALSE
函数主机()
//如果从子进程调用,则返回TRUE,否则返回FALSE
函数子()
//如果子进程已完全完成其工作,则返回TRUE,
//否则就错了。
函数完全完成()
//发送信号/消息“sig”以接收接收器为单个
//应接收sig的进程句柄或一组句柄
功能发送信号(信号发生器,接收器)
//终止调用进程
函数exit()
//将句柄返回给信号“sig”的发送方
函数senderOf(sig)
函数主进程()
master//包含主进程的句柄
children={}//这是子进程的一组空句柄
buf[SIZE]//主进程和所有子进程可用的大小为字节的内存区域
对于i=0到n-1
//生成新的子进程,并在其句柄处添加到正在运行的
//子进程。

children如果要向其他进程发送布尔条件信号,可能应该使用共享事件。您可以通过名称或句柄复制来共享它们。你可以有任意多的这些信号。例如,
WEXITED、WSTOPPED、WCONTINUED
中的每一个都可以有一个

查看您的编辑:活动非常适合这样做。在父级中创建命名事件,并通过命令将其名称传递给子级。这样父母和孩子就可以互相发出信号


您还需要共享内存部分,例如通过内存映射文件共享内存部分。这将对应于代码中的
buf

您所拥有的似乎是一个工作队列安排,其中您有一个生产者进程和一组工作者进程。不清楚您是否只是将共享内存用作工作队列,或者您的工作人员是否在共享内存上操作(可能是一个巨大的矩阵或向量问题)

在Win32中,您可能不会将其作为单独的进程来实现

您将使用已经共享内存(相同地址空间)的生产者/消费者线程集合,并使用信号量或条件变量实现工作队列


事实上,您可能会使用更高级别的抽象,例如。使用默认的Windows线程池,但是您可以使用../p>来创建自己的线程池。在回答实际问题之前,我将建议一个更好的解决方案:您应该考虑简化父与子之间的关系。 基于伪码,父母和孩子之间的信号被当作一种原始形式,即,他们所做的只是防止代码在这里出现:

  IF signal == IMDONE
    <logic here (involving reads/writes to buf)>
    sendSignal(STARTWORKING, senderOf(signal))
如果信号==IMDONE
发送信号(开始工作,发送信号))
避免同时运行多个实例。相反,
应该被移动到相应的子进程中,由互斥锁保护,以便一次只能有一个子进程运行它

在这一点上,家长所需要做的就是启动孩子并等待他们全部退出。在Windows中,通过等待进程句柄,可以轻松地完成此操作

(我可以想象,现代POSIX还支持某种比信号更复杂的跨进程互斥。)


同样值得重新考虑的是,您是否真的需要多个流程。多线程将更有效,如果代码编写正确,那么调整代码应该不会困难


尽管如此,如果出于某种原因,您必须尽可能多地保留原有的程序结构,那么您可能会选择它

  • 发送一个信号就变成了写入一个字节

  • 在子系统中,等待来自父系统的信号变为读取单个字节

  • 在父母家里等待任何一个孩子的消息都有点棘手。它仍然是单字节读取(对于每个子级),但如果需要支持64个以上的子级,则需要使用和

(或者,您可以使用多个线程,但这可能涉及太多的结构更改。)

  • 如果管道正确执行,当子管道退出或终止时,父管道中相应的读取操作将终止,并显示
    错误\u断开\u管道
    错误。因此,没有必要设立一个单独的机制来监测儿童的健康
在这种情况下,我认为这将是最合适的选择。这些是单工管道,所以每个孩子需要两个管道。可以将子进程的管道末端句柄作为子进程的标准输入和输出传递

对于匿名管道,您需要确保在每个子级启动后关闭父级句柄的副本,并且每个子级只继承与之对应的句柄