我有一个代码,它创建了两个管道,用于编写和读取调用另一个程序的2(到4个)子进程的数据。该程序的代码只有两个printf
,一个打印-
,另一个打印Done
到stdout
,它连接到父进程的读取管道。
在父进程中,我使用
read(pipes[i][1][0], buffer, sizeof(buffer)-1);
问题在于,如果我将buffer
的大小设置为4(例如),则read()
调用会读取-Do
这不是我想要的,因为我会调用{ {1}}之后再次。
如果大小为2,一切正常,因为我知道我要阅读的内容的大小,但在其余代码中我没有这些信息。
我在子进程的每个read()
之后尝试fflush(stdout)
但它不起作用。我觉得这很容易解决,但我无法弄明白,是否有办法逐个阅读子进程制作的图片?
答案 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字符。