- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
Linux 支持在“sys/wait.h”中定义的 POSIX 等待机制。方法 wait, waitid, waitpid可用于在使用 fork 创建的父进程和子进程之间交换状态信息.
Windows 既不提供对 fork 的( native )支持,也不提供 POSIX 等待机制。相反,还有其他方法可用于 spwan 子进程,即 CreateProcess .
当使用 fork/wait 将用 C 或 C++ 编写的 linux 应用程序移植到 Windows 时,什么是最合适的 native* 方法来监视父进程中子进程的状态变化(即 WEXITED, WSTOPPED, WCONTINUED ) ?
*native 表示不使用不随 Windows 提供或由 MS 以运行时环境形式直接提供的其他库、框架、程序(如 cygwin、minGW)。
编辑:按照评论中的要求,我确实提供了一些关于应该以伪代码的形式解决什么问题的更多信息:
//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)
最佳答案
在回答实际问题之前,我将推荐一个更好的解决方案:您应该考虑简化父子之间的关系。
根据伪代码,父子之间的信号是 cross-process mutex 的粗略形式。 ,也就是说,他们所做的就是阻止这里的代码:
IF signal == IMDONE
<logic here (involving reads/writes to buf)>
sendSignal(STARTWORKING, senderOf(signal))
同时运行多个实例。相反,<logic here>
应该移动到相应的子进程中,由互斥锁保护,以便一次只能有一个子进程运行它。
此时,父级需要做的就是启动子级并等待它们全部退出。这在 Windows 中很容易通过等待进程句柄来完成。
(我想现代 POSIX 也支持某种比信号更复杂的跨进程互斥锁。)
还值得重新考虑您是否真的需要多个进程。多线程效率会更高,如果代码写得好,适配应该不难。
尽管如此,如果出于某种原因您绝对必须保留尽可能多的原始程序结构,pipes可能是您最好的选择。
发送信号变成写入单个字节。
在 child 中,等待来自 parent 的信号变成读取单个字节。
在父级中等待来自任何子级的消息有点棘手。它仍然是单字节读取(对于每个 child ),但您需要使用 overlapped I/O而且,如果您需要抚养超过 64 个 child ,IOCP .
(或者,您可以使用多个线程,但这可能涉及太多的结构更改。)
ERROR_BROKEN_PIPE
。错误。因此,无需单独的机制来监测 child 的健康状况。在这种情况下,我认为anonymous pipes将是最合适的选择。这些是单工的,所以你需要为每个 child 准备两根 pipe 。您可以将子进程的管道句柄末端作为子进程的标准输入和输出传递。
对于匿名管道,您需要确保在每个子管道启动后关闭父管道的句柄副本,并且每个子管道仅继承与其自身管道对应的句柄。如果在其管道的子端有任何其他句柄保持打开状态,则当子退出时,父将不会收到任何通知。
这些都不是特别复杂,但请注意命名管道 I/O 有一点学习曲线。异步 I/O 更是如此,特别是如果您来自 UNIX 背景。请特别注意,要使用异步 I/O,您发出一个操作然后等待它完成,这与您等待 I/O 准备好然后发出操作的 UNIX 模型相反。
关于c - 最接近 POSIX 等待机制的 Windows 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34240883/
广播的原则 如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失维度和(或)轴长度为1的维度上进行。 在上面的对arr每一列减去列
之前在讲 MySQL 事务隔离性提到过,对于写操作给读操作的影响这种情形下发生的脏读、不可重复读、虚读问题。是通过MVCC 机制来进行解决的,那么MVCC到底是如何实现的,其内部原理是怎样的呢?我们要
我创建了一个 JavaScript 对象来保存用户在 ColorBox 中检查复选框时设置的值。 . 我对 jQuery 和“以正确的方式”编程 JavaScript 比较陌生,希望确保以下用于捕获用
我为了回答aquestion posted here on SO而玩示例,发现很难理解python的import *破坏作用域的机制。 首先是一点上下文:这个问题不涉及实际问题;我很清楚from fo
我想让我的类具有标识此类的参数 ID。例如我想要这样的东西: class Car { public static virtual string ID{get{return "car";}} }
更新:我使用的是 Java 1.6.34,没有机会升级到 Java 7。 我有一个场景,我每分钟只能调用一个方法 80 次。它实际上是由第 3 方编写的服务 API,如果您多次调用它,它会“关闭”(忽
希望这对于那些使用 Javascript 的人来说是一个简单的答案...... 我有一个日志文件,该文件正在被一个脚本监视,该脚本将注销中的新行提供给任何连接的浏览器。一些人评论说,他们希望看到的更多
我们正在开发针对 5.2 开发的 PHP 应用程序,但我们最近迁移到了 PHP 5.3。我们没有时间去解决所有迁移到 PHP 5.3 的问题。具体来说,我们有很多消息: Declaration of
简介 在实现定时调度功能的时候,我们往往会借助于第三方类库来完成,比如: quartz 、 spring schedule 等等。jdk从1.3版本开始,就提供了基于 timer 的定时调度功能。
Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而
我将编写自己的自定义控件,它与 UIButton 有很大不同。由于差异太大,我决定从头开始编写。所以我所有的子类都是 UIControl。 当我的控件在内部被触摸时,我想以目标操作的方式触发一条消息。
在我的代码中,在创建 TIdIMAP4 连接之前,我设置了一大堆 SASL 机制,希望按照规定的“最好到最差”顺序,如下所示: IMAP.SASLMechanisms.Add.SASL := mIdS
在 Kubernetes 中,假设我们有 3 个 pod,它们物理上托管在节点 X、Y 和 Z 上。当我使用“kubectl expose”将它们公开为服务时,它们都是集群中的节点(除了 X、Y 和
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我知道进程间通信 (ipc) 有几种方法,例如: 文件 信号 socket 消息队列 管道 命名管道 信号量 共享内存 消息传递 内存映射文件 但是我无法找到将这些机制相互比较并指出它们在不同环境中的
当我尝试连接到 teradata 时,出现了TD2 机制不支持单点登录 错误。 在 C# 中,我遇到了类似的问题,我通过添加 connectionStringBuilder.Authetication
我有一个带有 JSON API 的简单 Javascript 应用程序。目前它在客户端运行,但我想将它从客户端移动到服务器。我习惯于学习新平台,但在这种情况下,我的时间非常有限 - 所以我需要找到绝对
我想了解事件绑定(bind)/解除绑定(bind)在浏览器中是如何工作的。具体来说,如果我删除一个已经绑定(bind)了事件的元素,例如使用 jQuery:$("#anElement").remove
我不是在寻找具体答案,只是一个想法或提示。我有以下问题: Android 应用程序是 Web 服务的客户端。它有一个线程,通过 http 协议(protocol)发送事件(带有请求 ID 的 XML
我正在研究 FreeBSD TCP/IP 栈。似乎有 2 种 syn flood 机制,syncookies 和 syncache。我的问题是关于 syncookies,它是从头开始还是在 SYN 队
我是一名优秀的程序员,十分优秀!