gpt4 book ai didi

c - 管道和 fork() - 如何通过 C 中的管道编写 int 数组?

转载 作者:行者123 更新时间:2023-12-04 10:09:55 27 4
gpt4 key购买 nike

我正在尝试在 C 中学习管道,但我被卡住了。我尝试了很多东西,但无法获得正确的输出。

下一个程序应该显示:
123

但它的输出总是方向(除非我认为):

-1845296639

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main (int argc, char *argv[]){

int i;
int buff[4];
int f[2];

if(pipe(f) == -1)
perror("pipe");

for(i=0; i<3; i++){

int val = i+1;
switch(fork()){
case -1:
perror("fork");
break;
case 0:
close(f[0]);
write(f[1], &val, 1);
exit(0);
break;
default:
break;
}
}
close(f[1]);

for(i=0; i<3; i++)
wait(NULL);

read(f[0], buff, i);
printf("%d", *buff);

exit(0);
}

最佳答案

管道将字节从一处发送到另一处。因此,您需要精确指定要发送的字节数。然后确保您的发送代码准确地发送这些字节,并且您的接收代码准确地期望这些字节。

如果您想让它工作而不必以正确的方式做事,请执行以下操作:

发件人:

write(f[1], &val, sizeof(int));

接收者:
for (int i = 0; i < 3; ++i)
read(f[0], &buf[i], sizeof(int));

另请注意 printf("%d", *buff);打印数组中的第一个元素(元素零)。

请勿将接收码更改为 read(f[0], buf, 3 * sizeof(int)); .您的 write不是原子的(因为你打电话 write 三遍)所以你不能指望你的 read成为。

关于c - 管道和 fork() - 如何通过 C 中的管道编写 int 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15999336/

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