获取派生进程的标准输出/标准错误在子进程
问题描述:
我有一个要求fork()
获取派生进程的标准输出/标准错误在子进程
一个C程序,我有一个python脚本与
child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE,stdout=subprocess.PIPE, bufsize=0)
执行C程序现在,我可以读从标准输出和标准错误与child.stderr.read(1)
或child.communicate()
,...但我的问题是,现在,我怎么能得到只从输出分叉过程。这甚至有可能吗?我可以从两个版本中获得pid吗,原始的C程序和fork?
亲切的问候, 非常感谢你:)
的Fabian
答
什么你问的是要复杂和纯Python将是不可能的 - 你会需要一些OS-具体机制。
你真的提出了两个要求:
- 从父进程
- 拦截标准/出任意进程的PID标识派生进程
你如果你在Linux上,可能可以通过解析/ proc来实现前者,后者实际上是类似于调试器的一部分功能(例如,How can a process intercept stdout and stderr of another process on Linux?)
更可能的是,您将需要更改C程序的工作方式 - 例如,从python脚本中执行fork()/守护进程而不是中间C代码可以让您直接获取子进程。
答
我认为当你在C中fork一个进程时,你不能将任何描述符从子进程传递回父进程 - 但可能是我错了。只有你得到的是新的子进程的PID。最好的方法应该是你打开一个管道(使用通常的名称,例如管道名称包含进程的PID),然后你可以从任何地方打开它。
最后,当你fork()的过程中,将其提供给您的PID,并且可以编写两个PID(C二进制和叉状),以C程序中,例如具有分离器的标准输出:
cpid = fork();
printf("%d|%d", (int)get_pid(), cpid);
祝你好运:)
“这可能吗?”没有。“我可以从两个版本,原始的C程序和叉子上获得pid吗?”不是.C程序拥有那个孩子。你的进程拥有C程序。现在。不要担心Linux的细节,并描述你的**真实**问题。为什么你的Python程序不能像C程序那样运行相同的子进程? – 2012-02-26 15:00:49
更简单的方法可能是使用不同的输出格式,主进程可以从“ParentOutput:”开始,而子进程的输出是:“ChildOutput:”。然后你可以忽略你的python程序中的“ParentOutput”。 – springrider 2012-02-26 15:06:39