Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检查子PID是否正在等待扫描_C_Pid - Fatal编程技术网

C 检查子PID是否正在等待扫描

C 检查子PID是否正在等待扫描,c,pid,C,Pid,我有一个代码,在某种程度上是一个孩子。 仅限子级的代码是scanf。 父进程需要监视子进程的状态: 1) 运行 2) 正在等待scanf中的输入 3) 终止 使用waitpid和WNOHANG检查是否终止。问题是我不知道如何区分子进程是否正在等待输入 注:我的案例有一个限制,我不能将信息从孩子发送给父母。否则我可以在scanf前后使用变量 附言:我在linux下 如何检查子进程是否处于等待scanf输入(或通常的IO)的状态?是否使用?这就是你要找的吗 WaitForInputIdle 等待,直

我有一个代码,在某种程度上是一个孩子。 仅限子级的代码是scanf。 父进程需要监视子进程的状态: 1) 运行 2) 正在等待scanf中的输入 3) 终止

使用waitpid和WNOHANG检查是否终止。问题是我不知道如何区分子进程是否正在等待输入

注:我的案例有一个限制,我不能将信息从孩子发送给父母。否则我可以在scanf前后使用变量

附言:我在linux下

如何检查子进程是否处于等待scanf输入(或通常的IO)的状态?是否使用
?这就是你要找的吗

WaitForInputIdle

等待,直到指定的进程完成其初始输入的处理,并且正在等待用户输入而不等待任何输入,或者直到超时间隔已过

有关API的更多信息可在此处找到:
进程和IO的概念通常是分离的。子进程和父进程之间没有交换的信号,只有发送到父pid的unix(kill)信号传播到子进程

Waitpid只是等待子pid的终止,返回其状态代码

如果要在父进程和子进程之间交换数据,则需要在这两个进程之间创建一个
管道
(请参见
man-s 2管道
),请参见手册页以获取示例

如果要在子级中使用
scanf
(从stdin输入),则需要将
pipefd[0]
绑定到stdin文件描述符
0
(或stdin\u FILENO)

现在,您可以在父进程中使用
select
poll
,检查子进程是否准备好读取父进程发送到
pipefd[1]
的数据

如果您使用
printf
或其他
stdio.h
方法(例如通过STDOUT\u FILENO)向子级写入,则即使
select
poll
告知子级已准备好接收数据,父级上的IO也可能会被阻塞,如果子级读取速度太慢或过早停止读取,并且输出缓冲区已满(我认为默认大小为4096字节)

unistd.h
write调用可能返回一个值

nw = write(pipefd[1], buffer, nbytes);
nw
如果孩子没有读取那么多(
nbytes
)字节的输入


所以在进行异步通信时要小心跳闸的危险。当您了解异步方法时,请检查CSP(通信顺序过程)方法作为一种不同且更稳定的通信方法,它使用同步通信。

如果您解释了您试图实现的目标,会更好。这是一件奇怪的事情,所以对于你想要解决的实际问题,可能有更好的解决方案。我会编辑。谢谢你的提示。对不起,我没有定义。我在linux下。我会尽量找一个同等的,谢谢!谢谢你的解决方案。我用管道做了一些测试,似乎解决了我的问题。另外,我对IO和过程的概念是错误的,这个答案帮助我组织了我的想法。
nw = write(pipefd[1], buffer, nbytes);