C: 管道:如何正确使用管道传递动态 int 数组

C: Pipe: How to pass a dynamic int array using pipe correctly

我尝试在几个子进程中编写动态分配的 int 数组,并使用管道在父进程中读取它们,但结果类似于 [-15236548, 37526, -15236548, 37526,0,0,0, 0,0,0],看起来读取的是地址而不是实际值 [1,1,1,1,0,2,1,1,1,1]。我真的为此苦苦挣扎了一整天,任何帮助将不胜感激!!!

子进程有10个,先各自写入一个数组,全部写完后,父进程读取10个数组。

int *getArr(){
    int * arr1 = malloc(sizeof(int) *100);
    //do something
    return arr1;
}

//write values to pipe
void write_check(int fd, void *buffer, size_t len){
    char *p = buffer;
    while(len>0){
        size_t wlen = write(fd, p, len);
        if(wlen <= 0)
            exit(0);
        p += wlen;
        len -= wlen;
    }
}

// read values from pipe
void read_check(int fd, void *buffer, size_t len){
    char *p = buffer;
    while(len>0){
        size_t rlen = read(fd, p, len);
        if(rlen <= 0)
            exit(0);
        p += rlen;
        len -= rlen;
    }
}

// pass values, and get it ready to be wrote
void write_ints(int fd, int *p, int len){
    write_check(fd, p, len * sizeof(*p));
}

// allocate memory for fetching values
void read_ints(int fd, int *p, int len){
    p = malloc(len * sizeof(*p));
    read_check(fd, p, len* sizeof(*p));
}


int main(){
    int len = 100;
    int *arr1 = malloc(sizeof(int) * 100);
    int *fds = malloc(sizeof(int) * 10 * 2);

    // child processes write values to pipe
    for(int i=0; i<10; i++){
        child_pid = fork();
        if (child_pid == 0){
            // do something
            arr1 = getArr();
            write_ints(fd[i*2+1], &arr1, len);
        }
    }
    // parent process reads values 
    for(int i=0; i<10; i++){
        // do something
        read_ints(fd[i*2], &arr1, len);
    }
}

预期为 int * 但参数为 int ** 错误是由于传递 &arr1 造成的。指针的地址是双 pointer.just pass arr1(在 write_ints 和 read_ints 中)你不会得到那个错误。

void read_ints(int fd, int *p, int len){
    p = malloc(len * sizeof(*p));
    read_check(fd, p, len* sizeof(*p));
}

此功能无法使用。你传递给它一个指针,它会忽略它。然后它分配一些内存,将一些整数读入该内存,并且对指向该内存的指针不做任何事情,使调用者无法访问读取的值。

如果这个函数要分配内存,它需要return一个指向它分配的内存的指针。如果这个函数要接收一个指向它要将整数读入的内存的指针,那么它应该将整数读入提供的缓冲区而不是分配它自己的缓冲区。

如果有注释,您的代码将更容易调试。看着这个函数,我不知道它应该做什么,而且我在代码中看到了相互矛盾的信息。是应该分配一个缓冲区来读入整数,还是应该提供一个指向要读入的缓冲区的指针?评论会清除它。

您还不能指望您的代码来记录您的意图,因为您的代码还不够好,无法做到这一点。所以你需要使用评论,这样其他人才能知道你想做什么,而不仅仅是你实际做了什么。