繁体   English   中英

管道和fork() - 如何在C中通过管道写入int数组?

[英]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

的位模式-18452966390x92030201 ,假设32位2的补码int秒。

因此,您使用未初始化的缓冲区获得一个字节的垃圾,以及由fork ed children编写的三个字节。

据推测,你的平台是little-endian,这意味着在内存中,字节是

0x01 0x02 0x03 0x92

所以写入的字节按顺序按顺序到达,尽管期望read(...,...,3)在三个子节点之后读取三个字节,每个子节点都写入一个字节是大胆的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM