从子进程中逐个读取数据

时间:2014-09-23 09:48:38

标签: c printf pipe

我有一个代码,它创建了两个管道,用于编写和读取调用另一个程序的2(到4个)子进程的数据。该程序的代码只有两个printf,一个打印-,另一个打印Donestdout,它连接到父进程的读取管道。 在父进程中,我使用

读取数据
read(pipes[i][1][0], buffer, sizeof(buffer)-1);

问题在于,如果我将buffer的大小设置为4(例如),则read()调用会读取-Do这不是我想要的,因为我会调用{ {1}}之后再次。 如果大小为2,一切正常,因为我知道我要阅读的内容的大小,但在其余代码中我没有这些信息。

我在子进程的每个read()之后尝试fflush(stdout)但它不起作用。我觉得这很容易解决,但我无法弄明白,是否有办法逐个阅读子进程制作的图片?

2 个答案:

答案 0 :(得分:1)

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

将缓冲区大小设置为您确切的邮件大小是一个脆弱的黑客,因为它会在您添加不同长度的新邮件时中断。

通常,您希望通过面向流的连接(管道,流或TCP套接字)发送的任何内容都需要具有长度的消息头或分隔符,以便相当容易解析。


如果您迫切希望将每个写入视为离散消息,您可以选择使用数据报套接字,其实际行为与此类似。在这种情况下,您将寻找AF_UNIX/SOCK_DGRAM套接字。

答案 1 :(得分:0)

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

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

之后当你做第二次阅读时。通过执行以下操作读取4个字符:

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

如果要进行字符串操作以检查所读取的内容,则缓冲区的大小设置为5以包含最后的\ 0字符。