将数据发送到等待ppoll的另一个进程的stdin

时间:2016-09-05 21:10:51

标签: c linux bash shell

有以下代码:

#include <poll.h>

int main(int argc, char *argv[])
{
  pollfd pd;
  pd.fd = 0;
  pd.events = POLLIN;
  int ret = ::ppoll(&pd, 1, 0, 0);
  return 0;
}

这应该等待stdin上的一些数据,并在数据出现时唤醒。

以这种方式运行程序,似乎ppoll被唤醒(通过管道将数据传递给stdin):

$ echo 1 | ./main
$

然而,从另一个shell向进程发送内容并不会唤醒ppoll:

第一个shell:

$ ./main

第二个shell:

$ echo 1 > /proc/$(pgrep main)/fd/0

之后我发现在第一个shell中有打印1,但ppoll没有醒来。如何将数据正确地从另一个shell发送到进程的stdin,以便ppoll唤醒?

1 个答案:

答案 0 :(得分:3)

这根本不可能,除非该过程是以能够从外部(即通过FIFO或管道)向其提供数据的方式专门启动的。

即使/proc/$PID/fd/0(即标准输入流)指向进程的控制终端,(在没有重定向的情况下)/proc/$PID/fd/1/proc/$PID/fd/2也是如此(即标准输入流)输出和标准错误流):

$ ls -l /proc/$$/fd
lrwx------ 1 user user 64 Sep  6 01:36 0 -> /dev/pts/3
lrwx------ 1 user user 64 Sep  6 01:36 1 -> /dev/pts/3
lrwx------ 1 user user 64 Sep  6 01:36 2 -> /dev/pts/3

终端是伪设备,可以读取和写入。当进程从中读取时,终端提供从键盘输入的数据或通过其他方式(例如从剪贴板粘贴)。当到终端时,它会显示数据。现在,当您写入/proc/$PID/fd/0时,您写入终端而不是目标进程的标准输入流,这就是为什么您的数据显示但进程停留的原因淡漠。