C 最接近POSIX等待机制的窗口是什么?
Linux支持“sys/wait.h”中定义的POSIX等待机制。这些方法可用于在使用创建的父进程和子进程之间交换状态信息 Windows既不提供fork(本机)支持,也不提供POSIX等待机制。相反,spwan子进程还有其他可用的方法,即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以运行
在使用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管道
错误。因此,没有必要设立一个单独的机制来监测儿童的健康
在这种情况下,我认为这将是最合适的选择。这些是单工管道,所以每个孩子需要两个管道。可以将子进程的管道末端句柄作为子进程的标准输入和输出传递
对于匿名管道,您需要确保在每个子级启动后关闭父级句柄的副本,并且每个子级只继承与之对应的句柄