如何从终端标准输入重定向到进程标准输入
How to redirect from terminal stdin to process stdin
我的 运行ning 进程使用 getchar()
处理标准输入。当我 运行 它在前台时它工作正常。但是,如果我在后台 运行 它并执行 echo "a">> /proc/pid/fd/0
它将不起作用。在我的系统上,/proc/pid/fd/0
与 /proc/pts/0
相同,那么如何发送到进程的标准输入以便 getchar()
可以看到它?我正在通过 ssh 使用 C++。
当你 运行 多个程序在后台时,它们仍然有 /dev/pts/XX
作为它们的控制终端(和 stdin
),但它们不再有资格从中读取 --只有 shell 或前台任务可以做到这一点。如果他们这样做,他们将收到停止后台进程的 SIGTTIN
信号:
myaut@zenbook:~$ cat &
[1] 15250
myaut@zenbook:~$
[1]+ Stopped cat
这种行为的原因很简单:多个程序从一个源读取导致 race condition。 IE。当您输入 shell who am i
时,shell 将读取 who
,后台任务 #1 将读取 am
,任务 #2 将读取 i
.
解决方法很简单——不要使用伪终端在进程间传输数据:
- 使用管道 -- 未命名或命名(
mkfifo
)。它们就像从 stdin
读取一样简单。现代 shells 还提供 coprocesses 来避免命名管道。
- 在复杂情况下使用 UNIX 套接字
- 如果您仍然需要伪终端,请使用
screen
或其他终端仿真器为您的程序创建一个新伪终端。
我的 运行ning 进程使用 getchar()
处理标准输入。当我 运行 它在前台时它工作正常。但是,如果我在后台 运行 它并执行 echo "a">> /proc/pid/fd/0
它将不起作用。在我的系统上,/proc/pid/fd/0
与 /proc/pts/0
相同,那么如何发送到进程的标准输入以便 getchar()
可以看到它?我正在通过 ssh 使用 C++。
当你 运行 多个程序在后台时,它们仍然有 /dev/pts/XX
作为它们的控制终端(和 stdin
),但它们不再有资格从中读取 --只有 shell 或前台任务可以做到这一点。如果他们这样做,他们将收到停止后台进程的 SIGTTIN
信号:
myaut@zenbook:~$ cat &
[1] 15250
myaut@zenbook:~$
[1]+ Stopped cat
这种行为的原因很简单:多个程序从一个源读取导致 race condition。 IE。当您输入 shell who am i
时,shell 将读取 who
,后台任务 #1 将读取 am
,任务 #2 将读取 i
.
解决方法很简单——不要使用伪终端在进程间传输数据:
- 使用管道 -- 未命名或命名(
mkfifo
)。它们就像从stdin
读取一样简单。现代 shells 还提供 coprocesses 来避免命名管道。 - 在复杂情况下使用 UNIX 套接字
- 如果您仍然需要伪终端,请使用
screen
或其他终端仿真器为您的程序创建一个新伪终端。