进程的概念和IO通常是分离。除了发送给父PID的unix(kill)信号传播给孩子之外,在子进程和父进程之间没有信号交换。
Waitpid只是等待终止一个子pid,返回其状态码。
如果您想要在父级和子级之间交换数据,您需要在两个进程之间创建一个pipe
(请参阅man -s 2 pipe
),请参阅手册页中的示例。
如果你想在孩子使用scanf
(从标准输入),你需要将pipefd[0]
绑定到标准输入文件描述符0
(或STDIN_FILENO)。
现在,您可以在父进程中使用select
或poll
来检查孩子是否已准备好读取由父级发送给pipefd[1]
的数据。
如果使用printf
或其他一些stdio.h
方法写入孩子(通过STDOUT_FILENO为例),在父母的IO可能阻止反正就算select
或poll
告诉孩子准备好接收数据,如果孩子读得太慢或停止阅读太早,输出缓冲区已满(我认为它的默认大小为4096字节)。
一个unistd.h
写调用可能返回一个值
nw = write(pipefd[1], buffer, nbytes);
nw < nbytes
如果孩子不读的输入,许多(nbytes
)字节。
因此,在进行异步通信时要小心绊倒危险。当您了解异步方法时,请检查CSP(通信顺序进程)方法,作为使用同步通信的另一种更稳定的通信方法。
如果你解释你想要达到的目标会更好。这是一件很奇怪的事情,所以对于你想解决的实际问题,可能有更好的解决方案。 –
我将编辑。谢谢你的提示。 – Psyny