gpt4 book ai didi

c - 从管道问题中读取

转载 作者:太空宇宙 更新时间:2023-11-04 11:17:34 25 4
gpt4 key购买 nike

我在管道上写入 10 个整数,所以我调用 write 10 次,然后我只想调用 read pipe 一次并将写入的整数存储到大小为 10 的数组中,然后将数组中的所有整数添加到总额。问题是我读完后只得到 9 个整数。我做错了什么?

int main()
{
int fd[2];
int total = 0;
int result;
int nbytes;
int child;
int subVector;
int written;
static int readSum[P];
int partialSum;
if(pipe(fd) < 0){
perror("pipe");
}

for(child = 0; child < P; child++){
if((pid[child] = fork()) < 0){
perror("fork");
exit(1);
}
else if(pid[child] == 0){
close(fd[0]);
partialSum = getSubvectorSum(elementsList,child,P,SIZE);
//printf("Partial sum: %d by child #%d\n",partialSum,getpid());
written = write(fd[1],&partialSum,sizeof partialSum);
//printf("Child #%d has written: %d bytes.\n",getpid(),written);
if(written == 0){
printf("Writting not performed.");
}
close(fd[1]);
exit(0);
}
}

close(fd[1]);
int status = 0;

nbytes = read(fd[0],&readSum,sizeof readSum);
printf("Parent reads %d bytes\n",nbytes);
if(nbytes > 0){
for(child =0;child<P;child++){
total += readSum[child];
printf("Partial sum in father: %d\n",readSum[child]);
}
}
else{
printf("Failed to read.");
}
}

最佳答案

你忽视了圣人滚石乐队的智慧,不接受你不能总是得到你想要的,但有时你会得到你需要的。

(1) 无法保证在父级尝试读取之前所有子级都已运行并写入管道。

(2) 即使 (1) 确实发生,也不能保证您的读取会在一次读取中返回所有 10 个整数。 read 可以(而且通常会)返回比您要求的更少的值。

解决这个问题的一种方法是让您的 parent 等待它的 child ,这样您就知道他们完成了,然后循环阅读,直到您阅读了您需要的所有内容。

关于c - 从管道问题中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com