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

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 发送) 并在收到信号时自行关闭。