2015-10-14 53 views
1

我的最终目标是让父进程将文本行传递给子进程,然后子进程将文本打印到stdout。当父母获得用户输入并将其传递给孩子时,孩子在后台“永久”运行。我更喜欢一个单独的程序中的孩子。通过if语句将孩子和paretn区分开来,就像是fudge一样混乱。在子调用exec()后使用pipe()

我正在查看管道,但是我不确定管道是否可以在子节点调用exec()到另一个程序后进行父/子之间的通信。这可能吗?如果是这样,有没有可能让我指点的例子?如果不是,那么我可以使用什么方法的IPC?

+0

https://www.cs.cf.ac.uk/Dave/C/node33.html –

+0

我想我跳过枪,很乐意删除我的评论 - 这将使@阿蒙的显得很奇怪。很高兴看到你得到了答案。 – KevinDTimm

+0

@amon - 我将删除我的评论(请参阅上面的评论) – KevinDTimm

回答

2

标准方案是让程序作为小孩执行而不需要管道,只需使用stdin/stdout。您通过dup2()将管道的相应端作为fd 01(或者两者都带有用于双向通信的两个管道)来实现,对应于STDIN_FILENOSTDOUT_FILENO。之后,执行你的孩子程序。

当然, “命名管道”,如果您需要stdin/stdout为孩子的不同目的。

不过,如果你自己写的两个部分,你可能要考虑一下简单的解决方案:

孩子和家长通过区分if语句是凌乱忽悠。

无论如何,您必须这样做,至少要连接管道并调用exec()。只要创建单独的代码文件并根据需要调用像parent_main()child_main()这样的东西(不管你喜欢怎么称呼它们)。

+0

谢谢,你的答案是我所需要的。谢谢。我喜欢你简化父母的方式,不要像我原先想象的那样混乱。 –

0

在exec *()函数之后,子级共享父进程的所有文件描述符。所以如果你在fork()之前创建一个管道,你可以在它们中读写fd。

通常的方法是:

  • 创建管道(读FD,写FD)
  • 叉()
  • 父:
    • 阅读关闭FD(你不会从这里从父母读取)
    • 写入数据写入fd
    • 等待/死亡
  • 儿童
    • 接近写FD(你会不会从孩子写)
    • 读通过FD
    • 等待读取数据/死

无法看看你为什么要执行一个新的程序。如果真的需要,你必须使用标准的标准输入/标准输出(参见其他答案),或者让一个程序接受一个fd(filedescriptor,一个整数)作为参数,以便知道哪一个是管道。对我来说似乎不是很好。