【问题标题】:Writing end-of-transmission to stdin of a running process将传输结束写入正在运行的进程的标准输入
【发布时间】:2015-06-05 15:10:23
【问题描述】:

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

//launch worker threads

fgetc(stdin);
run  = 0;

//let threads shut down cleanly

从我启动进程的终端,我可以简单地按 ENTER 键,进程就会结束。

但是,如果我尝试从另一个终端写入该进程的标准输入

$ echo "\r" > /proc/<PID>/fd/0

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

fgetc(stdin);

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

$echo "\x04" > /proc/<PID>/fd/0

没有运气 - 我做错了什么?

【问题讨论】:

    标签: c bash stdin


    【解决方案1】:

    /proc/&lt;PID&gt;/fd/0 是指向进程的标准输入所连接的终端的符号链接。例如,ls -l 可能会显示 /proc/&lt;PID&gt;/fd/0 -&gt; /dev/pts/9

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

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

    我建议您找到一种不同的方式来指示您的进程退出。最简单的方法是让它监听SIGTERM(由kill &lt;PID&gt;发送)或SIGINT(由Ctrl-C发送)并在收到信号时自行关闭.

    【讨论】:

    • 谢谢——监听信号绝对是一个更干净的解决方案。
    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2011-12-31
    • 2012-09-18
    • 2021-03-03
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多