我有一个多线程进程,它等待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
没有运气 - 我做错了什么?
答案 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 发送)发出信号后自行关闭。