2016-04-24 84 views
1

我有一段代码在某个时候分叉了一个孩子。 只有孩子的代码是一个scanf。 父进程需要监视那朵子进程的状态:运行 2)在scanf 3等待输入)终止检查一个孩子的PID是否正在等待Scanf

检查终止 1)或不IS simples与waitpid函数和WNOHANG。问题是我不知道如何区分子进程是否正在等待输入。

PS .:我的情况有限制,我无法将信息从孩子发送给其父母。否则,我可以在scanf之前和之后使用变量。

PS:我是在linux下

如何我可以检查是否一个子进程在等待一个scanf函数输入(或IO一般)的状态进入?

+0

如果你解释你想要达到的目标会更好。这是一件很奇怪的事情,所以对于你想解决的实际问题,可能有更好的解决方案。 –

+0

我将编辑。谢谢你的提示。 – Psyny

回答

1

进程的概念和IO通常是分离。除了发送给父PID的unix(kill)信号传播给孩子之外,在子进程和父进程之间没有信号交换。

Waitpid只是等待终止一个子pid,返回其状态码。

如果您想要在父级和子级之间交换数据,您需要在两个进程之间创建一个pipe(请参阅man -s 2 pipe),请参阅手册页中的示例。

如果你想在孩子使用scanf(从标准输入),你需要将pipefd[0]绑定到标准输入文件描述符0(或STDIN_FILENO)。

现在,您可以在父进程中使用selectpoll来检查孩子是否已准备好读取由父级发送给pipefd[1]的数据。

如果使用printf或其他一些stdio.h方法写入孩子(通过STDOUT_FILENO为例),在父母的IO可能阻止反正就算selectpoll告诉孩子准备好接收数据,如果孩子读得太慢或停止阅读太早,输出缓冲区已满(我认为它的默认大小为4096字节)。

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

nw = write(pipefd[1], buffer, nbytes); 

nw < nbytes如果孩子不读的输入,许多(nbytes)字节。

因此,在进行异步通信时要小心绊倒危险。当您了解异步方法时,请检查CSP(通信顺序进程)方法,作为使用同步通信的另一种更稳定的通信方法。

+0

感谢您的解决方案。我用管道运行了一些睾丸,似乎解决了我的问题。另外,我的IO和过程的概念是错误的,这个答案帮助我整理了我的想法。 – Psyny

1

您使用的是<Windows.h>?这是你想要找到的吗?

WaitForInputIdle

等待,直到指定的过程已完成处理其初始输入端,并等待用户输入在没有输入之前,或者直到超时间隔是否已经过去。有关API

HANDLE hProc; 
// get hProc here 
WaitForInputIdle(hProc, INFINITE); // wait forever until input idle 
// do something here 

更多信息可以在这里找到: https://msdn.microsoft.com/en-us/library/windows/desktop/ms687022(v=vs.85).aspx

+0

对不起,我还没有定义。我在linux下。 我会尽力找到相应的,谢谢! – Psyny