我正在编写一个程序,让孩子从父母编写的管道中读取消息。但是问题是:在父级完成书写之前,孩子可能会开始在管道中阅读吗?如果是这样,孩子将阅读该消息的一部分并终止。我如何确保所有消息都将被读取而不会逐字符读取char并在有char时循环循环?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#define TEXT_LENGTH 20
int main(void) {
int p[2];
char msg[TEXT_LENGTH];
if (pipe(p) == -1) {
perror("Error");
exit(1);
}
switch (fork()) {
case -1:
perror("Error");
exit(1);
case 0:
close(p[1]);
read(p[0], &msg, TEXT_LENGTH);
printf("%s\n", msg);
exit(0);
default:
close(p[0]);
strcpy(msg, "Very long text ...\0");
write(p[1], &msg, TEXT_LENGTH);
wait(NULL);
}
return 0;
}
现在它可以工作了,但是如果文本很长,在孩子进入阅读之前,父级是否有时间写它?
答案 0 :(得分:0)
从调用fork
的那一刻起,您可以确保子进程会读取管道上写入的所有内容:
read
会阻塞直到有需要阅读的东西。 您可能想在父中写入close(p[1])
之后,以便孩子正确识别数据的结尾。在您的特定情况下,这不是问题,因为您写入了固定数量的数据并读取了完全相同的数量,但是通常最好在写入后关闭管道。
没有太多的担心。如果您的字符串很长,那么唯一的更好的办法就是分块读写,然后在子进程中分别处理每个块,这样程序就不会使用太多内存来保留不需要的内容。
另外,请注意:使用字符串文字"like this"
时,不必添加NUL终止符\0
,它会自动添加。
答案 1 :(得分:0)