在子进程中获取分叉进程的标准输出/标准错误流

6

我有一个调用fork()的C程序。

我还有一个执行C程序的Python脚本。

child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE,stdout=subprocess.PIPE, bufsize=0)

现在我可以使用child.stderr.read(1)child.communicate()stdoutstderr读取...但我的问题是如何仅获取来自forked进程的输出。这可能吗?我能否获取原始C程序和fork的pid?
祝好, 非常感谢:)
法比安

这真的可能吗?不行。我能从原始C程序和fork中获得pid吗?不行。C程序拥有该子进程。您的进程拥有C程序。现在,停止担心Linux细节,并描述您 真实 的问题。为什么您的Python程序不能运行与C程序相同的子进程? - S.Lott
一种更简单的方法可能是使用不同格式的输出,主进程可以以“ParentOutput:”开头,而子进程的输出为“ChildOutput:”。然后你可以在你的Python程序中忽略“ParentOutput”。 - springrider
2个回答

1

你所要求的内容会很复杂,而且在纯Python中不可能实现--你需要一些特定于操作系统的机制。

你真正要求的是:

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

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

更有可能的是,你会想改变你的C程序的工作方式--例如,在Python脚本中执行fork()/daemonization代替中间的C代码将让你直接得到子进程。


0

我认为在C中fork()一个进程时,不能将任何描述符从子进程传回父进程 - 但我可能是错的。您只能获得新子进程的PID。最好的方法是打开一个管道(使用约定俗成的名称,例如管道名称包含进程的PID),然后可以从任何地方打开它。

最后,当您fork()进程时,它会给您PID,并且您可以将C程序的PID和分叉的PID都写入stdout,例如使用分隔符:

cpid = fork();
printf("%d|%d", (int)get_pid(), cpid);

祝你好运 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接