2014-09-23 74 views
1

我有一个代码创建两个管道,用于写入和读取调用另一个程序的2(至4)个子进程的数据。这个程序的代码只是两个printf,一个打印-和另一个打印Done都连接到stdout连接到父进程的读取管道。 在父过程中,我阅读使用从子进程逐个读取数据

read(pipes[i][1][0], buffer, sizeof(buffer)-1); 

数据的问题是,如果我设置的buffer大小为4(比如说)read()调用读取-Do这不是我想要的,因为我会之后再次致电read()。 如果大小为2,则一切正常,因为我知道要读取的内容的大小,但在其他代码中,我没有这些信息。

我试过fflush(stdout)关于子进程每个printf()但它不起作用。我认为这很容易解决,但我无法弄清楚,有没有办法逐一阅读由子进程生成的相片?

回答

1

一种理智的方式可能是使用换行符'\n'作为分隔符。

将缓冲区大小设置为您的确切消息大小是一种非常脆弱的黑客攻击,因为只要您添加具有不同长度的新消息,它就会中断。

一般来说,您希望通过面向流的连接(管道,流或TCP套接字)发送的任何内容都需要带有长度的消息头或分隔符,以便于解析。


如果你拼命想要把每个写为离散消息,你可以选择使用数据报套接字,这实际上表现是这样的。在这种情况下,你会寻找一个AF_UNIX/SOCK_DGRAM socketpair。

+0

通过使用换行符,你的意思是我必须通过字符来读取char,并在发现''\ n''时停止? – 2014-09-23 11:27:59

+0

那么,你可以使用'fgets'或类似的东西。 – Useless 2014-09-23 12:03:54

+0

好的,我会使用该解决方案。谢谢。 – 2014-09-23 12:25:13

0

您可以将缓冲区的大小设置为5,并在执行第一次读取()时读取“ - ”。通过以下操作只能读取1个字符:

read(pipes[i][1][0], buffer, 2); 

然后当您执行第二次读取时。通过做阅读4个字符:

read(pipes[i][1][0], buffer, 4); 

缓冲区的大小设置为5含有到底\ 0字符,如果你想要做的字符串操作来检查你所读的。

+0

这解决了我给出的示例消息的问题,但在代码的其余部分中,我不知道要读取的内容的大小,则无法这样做。 – 2014-09-23 11:28:34

+0

但是,如果您不知道要读取的内容的大小,则必须通过执行多次读取来完成。 例如,如果您正在从其他进程读取一组命令/数据包。另一个进程可以给出具有恒定长度的分组的标识符。你可以阅读,然后根据你将要做的下一次阅读的大小来决定。 或者在其他情况下,如果您知道您将收到的东西的顺序,那么您可以按照相应的读取大小以特定顺序阅读它们。 – Sami 2014-09-23 15:57:05