[英]Pipes and fork() - How to write an array of int throught a pipe in C?
我正在试图用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
了三次write
),所以你不能指望你的read
。
的位模式-1845296639
是0x92030201
,假设32位2的补码int
秒。
因此,您使用未初始化的缓冲区获得一个字节的垃圾,以及由fork
ed children编写的三个字节。
据推测,你的平台是little-endian,这意味着在内存中,字节是
0x01 0x02 0x03 0x92
所以写入的字节按顺序按顺序到达,尽管期望read(...,...,3)
在三个子节点之后读取三个字节,每个子节点都写入一个字节是大胆的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.