获取子进程中分叉进程的stdout / stderr

时间:2012-02-26 13:40:16

标签: python fork subprocess stdout stderr

我有一个调用fork()

的C程序

我有一个用

执行C程序的python脚本
child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE,stdout=subprocess.PIPE, bufsize=0)

现在我可以使用child.stderr.read(1)child.communicate()来阅读 stdout stderr ,...但我现在的问题是,我该怎么办? 分叉进程的输出。这甚至可能吗?我可以从原始C程序和 fork 中获取pid吗?

亲切的问候, 非常感谢你:))

费边

2 个答案:

答案 0 :(得分:1)

你要求的是复杂的,并且在纯python中是不可能的 - 你需要一些特定于操作系统的机制。

你真的要求两件事:

  • 从父进程的PID中识别分叉进程
  • 拦截任意过程的标准输入/输出

如果你在Linux上,你可以通过解析/ proc来完成前者,后者实际上是一个类似调试器的功能(例如How can a process intercept stdout and stderr of another process on Linux?

更有可能的是,您需要更改C程序的工作方式 - 例如,从python脚本而不是中间C代码执行fork()/ daemonization将允许您直接获取子进程。

答案 1 :(得分:0)

我认为当你在C中fork()一个进程时,你不能将子进程中的任何描述符传递给父进程 - 但可能是我错了。只有你得到的是新子进程的PID。最好的方法是打开一个管道(按常规名称,例如管道名称包含进程的PID),然后你可以从任何地方打开它。

最后,当你fork()进程时,它会给你PID,你可以将PID(C二进制和分叉)写入C程序的stdout,例如带分隔符:

cpid = fork();
printf("%d|%d", (int)get_pid(), cpid);
祝你好运:)