我有一个代码,在某种程度上分叉一个孩子。 仅限子代码是scanf。 父进程需要监视tis子进程的状态: 1)跑步 2)等待scanf中的输入 3)终止
检查终止与否是waitpid和WNOHANG的简单。问题是我不知道如何区分子进程是否在等待输入。
PS。:我的案件有一个限制,我无法将信息从孩子发送到其父母。否则我只能在scanf之前和之后使用变量。
PS:我在linux下
如何检查子进程是否处于等待scanf输入(或一般IO)的状态?
答案 0 :(得分:1)
您使用的是<Windows.h>
吗?这是你想要找到的吗?
WaitForInputIdle
等待指定的进程完成处理其初始输入并等待没有输入待处理的用户输入,或等待超时间隔结束。
HANDLE hProc;
// get hProc here
WaitForInputIdle(hProc, INFINITE); // wait forever until input idle
// do something here
有关API的更多信息,请访问: https://msdn.microsoft.com/en-us/library/windows/desktop/ms687022(v=vs.85).aspx
答案 1 :(得分:1)
流程和IO的概念通常是不相关的。除了发送到父pid的unix(kill)信号传播给子进程之外,没有在子进程和父进程之间交换的信号。
Waitpid只是等待子pid终止,返回其状态码。
如果您想在父和子之间交换数据,您需要在两个进程之间创建pipe
(请参阅man -s 2 pipe
),请参阅手册页以获取示例。
如果要在子节点中使用scanf
(从stdin输入),则需要将pipefd[0]
绑定到stdin文件描述符0
(或STDIN_FILENO)。
现在,您可以在父进程中使用select
或poll
来检查子进程是否已准备好读取父进程发送到pipefd[1]
的数据。
如果您使用printf
或其他stdio.h
方法向孩子写信(例如,通过STDOUT_FILENO),父母的IO可能会阻止,即使select
或{ {1}}告诉孩子准备接收数据,如果孩子读得太慢或者太早停止读取并且输出缓冲区已满(我认为其默认大小为4096字节)。
poll
写入调用可能会返回值
unistd.h
nw = write(pipefd[1], buffer, nbytes);
如果孩子没有读取那么多(nw < nbytes
)个字节的输入。
在进行异步通信时,请注意绊倒危险。当您理解异步方法时,请将CSP(通信顺序进程)方法检查为使用同步通信的另一种更稳定的通信方法。