将传输结束写入 运行 进程的标准输入
Writing end-of-transmission to stdin of a running process
我有一个多线程进程等待来自 stdin 的输入干净地关闭:
//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
运气不好——我做错了什么?
/proc/<PID>/fd/0
是一个 symlink 到进程的标准输入所连接的终端。例如,ls -l
可能显示 /proc/<PID>/fd/0 -> /dev/pts/9
.
尝试写入 link 并不意味着您将写入进程的标准输入;这意味着您将写入该进程正在读取的任何终端。您的 echo 命令相当于 echo "\r" > /dev/pts/9
.
(顺便说一句,你需要写 echo -e "\r"
或 echo $'\r'
来写回车符 return。同样在 UNIX 上,行尾由 [=16 分隔=] 而不是 \r
。你实际上可以只写 echo
来输出一个换行符,因为它会自动附加一个。)
我建议您寻找一种不同的方式来指示您的进程退出。最简单的方法是让它监听 SIGTERM
(由 kill <PID>
发送)或 SIGINT
(由 Ctrl-C 发送) 并在收到信号时自行关闭。
我有一个多线程进程等待来自 stdin 的输入干净地关闭:
//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
运气不好——我做错了什么?
/proc/<PID>/fd/0
是一个 symlink 到进程的标准输入所连接的终端。例如,ls -l
可能显示 /proc/<PID>/fd/0 -> /dev/pts/9
.
尝试写入 link 并不意味着您将写入进程的标准输入;这意味着您将写入该进程正在读取的任何终端。您的 echo 命令相当于 echo "\r" > /dev/pts/9
.
(顺便说一句,你需要写 echo -e "\r"
或 echo $'\r'
来写回车符 return。同样在 UNIX 上,行尾由 [=16 分隔=] 而不是 \r
。你实际上可以只写 echo
来输出一个换行符,因为它会自动附加一个。)
我建议您寻找一种不同的方式来指示您的进程退出。最简单的方法是让它监听 SIGTERM
(由 kill <PID>
发送)或 SIGINT
(由 Ctrl-C 发送) 并在收到信号时自行关闭。