我目前遇到的一个问题是,一旦我生成了这样的子进程并再次开始键入输入字符,这些字符就会被生成的子进程通过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);
好的,所以您希望能够启动异步子进程,它们的输入直接连接到/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中,放入 执行此命令以使脚本可运行: 运行 :