当前位置: 首页 > 知识库问答 >
问题:

不要将从shell启动的进程的stdin与shell本身共享

訾凯歌
2023-03-14

我目前遇到的一个问题是,一旦我生成了这样的子进程并再次开始键入输入字符,这些字符就会被生成的子进程通过stdin接收。这并不奇怪,因为我在分叉子文件描述符后不会修改它们,而且我理解这意味着它们都与主进程共享stdin_fileno底层的同一个流。

然而,这不是我的意图。在这方面,我希望我的程序的行为类似于例如bash,这样,在后台启动正在进行的进程后重新获得提示符后,在该提示符上键入的任何字符将只被bash看到,而不是被派生的进程看到。这就是我的问题所在,因为我甚至不明白bash是如何做到这一点的。在/proc/.../fd/0查看bash和任何派生的进程,它们总是指向同一个伪终端。只需将生成的进程stdin重定向到例如/dev/null也显然会产生不同的行为。

我在这里不需要一个完整的实现,只是一个一般性的提示。

int master;
int slave;

openpty(&master, &slave, nullptr, nullptr, nullptr);

dup2(slave, STDIN_FILENO);

共有1个答案

司寇季
2023-03-14

好的,所以您希望能够启动异步子进程,它们的输入直接连接到/dev/null,并且在Unix或类似Unix的系统中,当它们死亡时不会变成僵尸。

对于重定向部分,常见的方法是关闭fork和exec之间的标准输入文件(文件号0):

pid = fork();
if (pid == 0) {        // in child
    close(0);          // close standard input
    execve(...);
}

如果不关闭文件1和2,子文件的输出仍将转到终端。您可以关闭它们,但任何输出都将被静默丢弃...

signal(SIGCHLD, SIG_IGN);
pid = fork();                // this child will never become a zombie process
 类似资料:
  • 0.3 新版功能. Python 拥有的交互式 Shell 是人人都喜欢它的一个重要原因。交互式 Shell 允许你实时的运行 Python 命令并且立即得到返回结果。Flask 本身并未内置 一个交互式 Shell ,因为它并不需要任何前台的特殊设置,仅仅导入您的应用 然后开始探索和使用即可。 然而这里有一些易于获得的助手,可以帮助您在 Shell 遨游时获得更为 愉悦的体验。交互式控制台回话的

  • 我的jmx testplan所在的当前目录是否有属性? ubuntu 12.04上的apache jmeter 2.8

  • 本文向大家介绍Shell实现的Oracle启动脚本分享,包括了Shell实现的Oracle启动脚本分享的使用技巧和注意事项,需要的朋友参考一下 Usage: sh oracled [start|stop|restart] SIDs 其中SIDs是数据库名,多个名称之间用逗号分隔。缺省的操作是 restart ,也可以指定需要进行的操作( start | stop | restart )

  • 问题内容: 我正在使用以下命令启动子流程: 但是,当我尝试杀死使用: 要么 该命令一直在后台运行,所以我想知道如何才能真正终止该过程。 请注意,当我使用以下命令运行命令时: 发出时,它确实成功终止。 问题答案: 使用进程组,以便能够向组中的所有进程发送信号。为此,您应该将会话ID附加到生成的子进程的父进程中,在您的情况下这是一个外壳程序。这将使其成为流程的组长。因此,现在,当信号发送到流程组负责人

  • 问题内容: 我尝试谷歌搜索答案,但没有运气。 我需要使用我的超级计算机服务器,但是要运行我的python脚本,必须通过shell脚本执行。 例如我要执行 如何做到这一点? 问题答案: 只需确保python可执行文件在PATH环境变量中,然后在脚本中添加 细节: 在文件job.sh中,放入 执行此命令以使脚本可运行: 运行 :