【发布时间】:2022-01-15 10:24:11
【问题描述】:
您好,我有一个 C 程序,基本上假设它模拟 linux 中的管道函数并写入在 .txt 文件中读取的字节数,所以
./a.out cat test : grep -v le : wc -l
我要解决的问题是
既然我知道每个进程返回的数量不同,为什么文件中写入的字节数相同?
这段代码在父进程中执行,并尝试使用读取系统调用计算每个输出的字节数,并将输出写入下一个进程的写入系统调用,以便下一个进程可以将输出用作他的意见。
假设我有这些管道a | b | c
此代码将读取a 的输出并将其写入b,以便b 可以将其用作输入等等。
for (int i = 1; i < processes-1; i++) {
close(apipe[i][1]);
char str[4096];
int count=0;
int nbChar=0;
while(1){
count=read(apipe[i][0],str,sizeof(str));
nbChar+=count;
if(count==-1){
if (errno == EINTR) {
continue;
} else {
perror("read");
exit(1);
}
}else if(count==0)break;
}
char *leInput=(char*)malloc(nbChar*sizeof(char));
strncpy(leInput,str,nbChar);
if(i>0){
fprintf(fp, "%d : %d \n ", i,nbChar);
}
close(apipe[i][0]);
write(apipe[i+1][1], leInput, nbChar);
}
【问题讨论】:
-
每次调用
read()时,您都会写入str的开头,通过循环覆盖您上次读取的内容。 -
所以没有
nbChar字符可以复制到leInput。 -
但是我在每个进程之后都重置了循环,所以下一个进程不能访问新的 str 吗?
-
我说的是
while循环。