如何从终端标准重定向到处理标准
How to redirect from terminal stdin to process stdin
我的运行进程使用 getchar()
处理 stdin。当我在前台运行它时,它工作正常。但是,如果我在后台运行它并执行echo "a">> /proc/pid/fd/0
它将不起作用。在我的系统上,/proc/pid/fd/0
与 /proc/pts/0
相同,那么如何发送到进程的 stdin,以便getchar()
可以看到它?我正在通过 ssh 在C++工作。
当你在后台运行多个程序时,它们仍然有/dev/pts/XX
作为他们的控制终端(和stdin
(,但他们不再有资格从中读取 - 只有shell或前台任务可以做到这一点。如果他们这样做,他们将收到停止后台进程SIGTTIN
信号:
myaut@zenbook:~$ cat &
[1] 15250
myaut@zenbook:~$
[1]+ Stopped cat
这种行为的推理很简单:从一个源读取多个程序会导致竞争条件。 即当你输入到shell who am i
时,shell将读取who
,后台任务#1将读取am
,任务#2将读取i
。
解决方案很简单 - 不要使用伪终端在进程之间传输数据:
- 使用管道 -- 未命名或命名(带
mkfifo
(。它们就像从stdin
中读取一样简单。现代 shell 还提供了允许避免命名管道的协进程。 - 在复杂情况下使用 UNIX 套接字
- 如果仍然需要伪终端,请使用
screen
或其他终端仿真器为您的程序创建一个新终端。
相关文章:
- 将标准输出重定向到ostream
- 使用重定向标准处理子进程中的 kbhit
- 在程序执行期间从标准输出重定向到自定义流
- Win32 GUI C(++) 应用将标准输出和标准输出重定向到磁盘上的同一文件
- 将线程之间的标准输入/输出重定向
- 无法使用创建进程重定向标准输出
- 我可以重定向两个子进程的标准输出吗?
- 重定向标准输出时调用 dup2 失败
- 是否可以在重定向之前读取标准输出
- 如何使用重定向的标准输入读取文件,即cin(注意:不使用ifstream)
- 如何在 C++ 中的不同函数中实现重定向标准输入
- Windows Batch - 如何在将标准输出重定向到文件时添加时间戳
- 将文件的内容重定向为可执行文件linux的标准输入
- Getline 在将文件重定向到标准输入时会导致无限循环
- 将一个进程标准输出重定向到管道将产生不同的运行结果
- 如何将我的应用程序生成的标准 Mac OS X 日志输出重定向到文件
- 如何从终端标准重定向到处理标准
- 在 cpp 中重定向标准输出
- C++通过重定向 cout 将标准输出复制到文件
- 从 C++ 中的另一个程序重定向标准输出