首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从终端stdin重定向到处理stdin

如何从终端stdin重定向到处理stdin
EN

Stack Overflow用户
提问于 2015-04-10 02:11:06
回答 1查看 722关注 0票数 5

我的运行过程使用getchar()处理stdin。当我在前台运行它的时候,它工作得很好。但是,如果我在后台运行它并执行echo "a">> /proc/pid/fd/0,它将无法工作。在我的系统中,/proc/pid/fd/0/proc/pts/0一样,所以我如何发送到进程的stdin,以便getchar()能够看到它?我在C++的ssh工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-10 07:49:28

当您在后台运行多个程序时,它们仍然以/dev/pts/XX作为它们的控制终端(和stdin),但是它们不再有资格读取它--只有shell或前台任务才能做到这一点。如果他们这样做了,他们将得到停止后台进程的SIGTTIN信号:

代码语言:javascript
复制
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或其他终端模拟器为您的程序创建一个新的终端。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29552203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档