我的最终目标是让父进程将文本行传递给子进程,然后子进程将文本打印到stdout。当父母获得用户输入并将其传递给孩子时,孩子在后台“永久”运行。我更喜欢一个单独的程序中的孩子。通过if语句将孩子和paretn区分开来,就像是fudge一样混乱。在子调用exec()后使用pipe()
我正在查看管道,但是我不确定管道是否可以在子节点调用exec()到另一个程序后进行父/子之间的通信。这可能吗?如果是这样,有没有可能让我指点的例子?如果不是,那么我可以使用什么方法的IPC?
我的最终目标是让父进程将文本行传递给子进程,然后子进程将文本打印到stdout。当父母获得用户输入并将其传递给孩子时,孩子在后台“永久”运行。我更喜欢一个单独的程序中的孩子。通过if语句将孩子和paretn区分开来,就像是fudge一样混乱。在子调用exec()后使用pipe()
我正在查看管道,但是我不确定管道是否可以在子节点调用exec()到另一个程序后进行父/子之间的通信。这可能吗?如果是这样,有没有可能让我指点的例子?如果不是,那么我可以使用什么方法的IPC?
标准方案是让程序作为小孩执行而不需要管道,只需使用stdin
/stdout
。您通过dup2()
将管道的相应端作为fd 0
或1
(或者两者都带有用于双向通信的两个管道)来实现,对应于STDIN_FILENO
和STDOUT_FILENO
。之后,执行你的孩子程序。
当然, “命名管道”,如果您需要stdin
/stdout
为孩子的不同目的。
不过,如果你自己写的两个部分,你可能要考虑一下简单的解决方案:
孩子和家长通过区分if语句是凌乱忽悠。
无论如何,您必须这样做,至少要连接管道并调用exec()。只要创建单独的代码文件并根据需要调用像parent_main()
和child_main()
这样的东西(不管你喜欢怎么称呼它们)。
谢谢,你的答案是我所需要的。谢谢。我喜欢你简化父母的方式,不要像我原先想象的那样混乱。 –
在exec *()函数之后,子级共享父进程的所有文件描述符。所以如果你在fork()之前创建一个管道,你可以在它们中读写fd。
通常的方法是:
无法看看你为什么要执行一个新的程序。如果真的需要,你必须使用标准的标准输入/标准输出(参见其他答案),或者让一个程序接受一个fd(filedescriptor,一个整数)作为参数,以便知道哪一个是管道。对我来说似乎不是很好。
https://www.cs.cf.ac.uk/Dave/C/node33.html –
我想我跳过枪,很乐意删除我的评论 - 这将使@阿蒙的显得很奇怪。很高兴看到你得到了答案。 – KevinDTimm
@amon - 我将删除我的评论(请参阅上面的评论) – KevinDTimm