将传输结束写入正在运行的进程的标准输入

时间:2015-06-05 15:10:24

标签: c bash stdin

我有一个多线程进程,它等待stdin的输入干净地关闭:

//launch worker threads

fgetc(stdin);
run  = 0;

//let threads shut down cleanly

从我启动过程的终端,我只需按ENTER键即可结束。

但是,如果我尝试通过

从另一个终端写入该进程的stdin
$ echo "\r" > /proc/<PID>/fd/0

\ r \ n将出现在运行进程的终端屏幕上,但该进程仍然挂起

fgetc(stdin);

然后我尝试发送传输结束字符

$echo "\x04" > /proc/<PID>/fd/0
没有运气 - 我做错了什么?

1 个答案:

答案 0 :(得分:2)

/proc/<PID>/fd/0是进程的stdin所连接的终端的符号链接。例如,ls -l可能会显示/proc/<PID>/fd/0 -> /dev/pts/9

尝试写入该链接并不意味着您将写入该进程的标准输入;它意味着你将写入进程正在读取的任何终端。您的echo命令等同于echo "\r" > /dev/pts/9

(顺便说一下,您需要编写echo -e "\r"echo $'\r'来编写回车符。同样在UNIX上,行末号由\n分隔而不是{{1实际上你可以写\r来输出换行符,因为它会自动附加换行符。)

我建议您找一种不同的方式来表示您的流程退出。最简单的方法是让它听取echo(由SIGTERM发送)或kill <PID>(由 Ctrl - C 发送)发出信号后自行关闭。