2011-07-04 87 views
0

我想也许这是一个明显的问题,但我只是想问问你们。使用管道的进程间通信

我正在使用管道系统调用来创建未命名管道的父子进程通信。

我的子进程需要收集一些信息并将其发送给其父。我的问题是:

  1. 我只能使用写入和读取功能发送和接收字符串吗?我不得不忘记发送结构。
  2. 如果我对上一个问题的回答是“是”,将所有信息传递给父进程的正确方法是调用函数write和read几次?

非常感谢!

+0

谢谢你,米去看看如何做到这一点! –

+0

我已将“父亲进程”改为“父进程”,这不仅在政治上是正确的,而且是技术术语。 – aib

回答

2

你可以write()read()struct就好了;使用指向struct的指针作为buf参数。当你想在不同机器上运行的进程之间执行此操作时,会遇到问题,需要对可移植表示进行编组/解组,以确保各处的值都以相同的方式理解。这包括识别数据“数据包”的开始和结束,因为管道并没有真正的数据包概念:如果你正在做的是写一系列相同的数据,那么你可以只使用write()他们和读者可以依靠read()返回0来表示该系列的结束;但是如果你还需要发送其他信息,那么你需要一个成帧协议来说“接下来是什么样的这样一种”struct“,”接下来是一个字符串“等。

+5

另外,包含_pointers_到其他内容的'struct'很难通过 - 指针在其他地址空间中并不意味着什么。 – sarnold

+0

好的,所以传递一个链表并没有什么意义,对吧?使用其他方法更好吗? –

+0

如果唯一的指针是链接列表指针,那么只需按顺序(写入())它们(实际上,作为数组而不是链接列表)。接收器对每个元素进行read()操作,为它分配一个新的列表条目,并将它链接到它构建的列表中。 – geekosaur