Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 逐个从子进程读取数据_C_Printf_Pipe - Fatal编程技术网

C 逐个从子进程读取数据

C 逐个从子进程读取数据,c,printf,pipe,C,Printf,Pipe,我有一个代码,它创建了两个管道,用于写入和读取调用另一个程序的2(到4)个子进程的数据。该程序的代码仅为两个printf,一个打印-,另一个打印完成,都到连接到父进程的读取管道的标准输出。 在父进程中,我使用 read(pipes[i][1][0], buffer, sizeof(buffer)-1); 问题是,如果我将缓冲区的大小设置为4(例如),read()调用reads-Do,这不是我想要的,因为之后我将再次调用read()。 如果大小为2,则一切正常,因为我知道要阅读的内容的大小,但在

我有一个代码,它创建了两个管道,用于写入和读取调用另一个程序的2(到4)个子进程的数据。该程序的代码仅为两个
printf
,一个打印
-
,另一个打印
完成
,都到连接到父进程的读取管道的
标准输出。
在父进程中,我使用

read(pipes[i][1][0], buffer, sizeof(buffer)-1);
问题是,如果我将
缓冲区的大小设置为4(例如),
read()
调用reads
-Do
,这不是我想要的,因为之后我将再次调用
read()
。 如果大小为2,则一切正常,因为我知道要阅读的内容的大小,但在其余代码中,我没有这些信息


我在子进程上的每个
printf()
之后都尝试了
fflush(stdout)
,但它不起作用。我认为这很容易解决,但我不明白,有没有办法逐个读取子进程生成的打印?

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

read(pipes[i][1][0], buffer, 2);
然后当你读第二遍的时候。通过执行以下操作读取4个字符:

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

如果要执行字符串操作以检查读取内容,则将缓冲区的大小设置为5,以在结尾包含\0字符。

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

将缓冲区大小设置为确切的消息大小是一种脆弱的攻击,因为一旦添加不同长度的新消息,缓冲区就会被破坏

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



如果您非常希望将每次写入都视为一条离散的消息,您也可以使用数据报套接字,其实际行为如下。在这种情况下,您将寻找一个
AF\u UNIX/SOCK\DGRAM
socketpair。

使用换行符,您的意思是我必须逐字符读取,并在找到
'\n'
时停止?好的,您可以使用
fgets
或类似的东西。好的,我将使用该解决方案。谢谢。这解决了我给出的示例消息的问题,但是在代码的其余部分,我不知道要阅读的内容的大小,所以不可能这样做。但是如果你不知道要阅读的内容的大小,那么你必须通过多次阅读来完成。例如,如果您正在从其他进程读取一组命令/数据包。另一个过程可以给出具有恒定长度的分组的标识符。你可以阅读它,然后根据它决定下一次阅读的大小。或者在其他情况下,如果您知道接收内容的顺序,那么您可以按照相应的读取大小以特定的顺序读取它们。