【问题标题】:pipe integer from child to parent wrong value C从孩子到父母的管道整数错误值C
【发布时间】:2017-09-02 19:15:02
【问题描述】:

我正在尝试将值从子级发送给父级,但没有得到所需的输出。谁能弄清楚我做错了什么?

   int main() {
    printf("I am the parent with process ID:%d\r\n", (int) getpid());
    int rc = fork();
    int sum = 0;
    int array[6] = {2, 3, 7, -1, 10, 6};
    int pipeNum[2];

    pipe(pipeNum);

    if (rc < 0) {
        fprintf(stderr, "fork failed\r\n");
        exit(1);
    } else if (rc == 0) {
        for (int i = 0; i < 6; i++) {
            sum += array[i];
        }
        close(pipeNum[0]);
        printf("I am the child with process ID:%d and I am sending %d to my parent.\r\n", (int) getpid(), sum);
        write(pipeNum[1], &sum, sizeof(sum));
        close(pipeNum[1]);      
    } else {
        wait(NULL);
        close(pipeNum[1]);
        read(pipeNum[0], &sum, sizeof(sum));
        printf("I am the parent with process ID:%d with a final sum of %d\r\n", (int) getpid(), sum);
        close(pipeNum[0]);
        exit(0);
    }
    return 0;
}

这是我得到的输出
我是进程 ID 的父级:XXX
我是进程 ID:XXX 的孩子,我将 27 发送给我的父母。
我是进程 ID:XXX 的父级,最终总和为 0

任何帮助将不胜感激

【问题讨论】:

    标签: pipe fork


    【解决方案1】:

    您将 sum 传递给 read() 并将 sum 的指针传递给 write();你应该为两者传递指针

    read(pipeNum[0], &newSum, sizeof(newSum));
    
    write(pipeNum[1], &sum, sizeof(sum));
    

    【讨论】:

    • 当我尝试这个时,我得到了一个错误——注意:预期的 'const void *' 但参数的类型是 'int' _READ_WRITE_RETURN_TYPE _EXFUN(write, (int __fd, const void *__buf, size_t __nbyte ));
    • 嗯,对不起,现在我不确定了,我想也许 write() 也需要指针。也可能是:在需要指针的地方,您应该将其强制转换为 (void *)。试着告诉我
    • 我找到了一个帖子并尝试了这个 - 我已经更新了我得到的仍然不正确的内容 -- stackoverflow.com/questions/12864265/…
    • 尝试在分叉之前定义和初始化管道!
    • 是的,我认为是因为在 fork 之后用 pipe() 初始化它意味着父亲和孩子打开了不同的管道,这些管道从一个到另一个是不可访问的
    【解决方案2】:

    问题是我正在创建进程的副本并创建一个管道,导致它们无法通信,因为现在有 2 个管道。

    int rc = fork();
    int pipeNum[2];
    pipe(pipeNum);
    

    下面列出了需要发生的事情

    int pipeNum[2];
    pipe(pipeNum);
    int rc = fork();
    

    先创建管道后问题已解决

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-24
      • 2017-08-26
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      相关资源
      最近更新 更多