有以下代码:
#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唤醒?
答案 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
时,您写入终端而不是目标进程的标准输入流,这就是为什么您的数据显示但进程停留的原因淡漠。