简单的管道程序得到这个错误 - '程序接收信号SIGPIPE,断管'

时间:2016-01-11 16:51:27

标签: c linux pipe

我有一个简单程序的以下代码,其中一个父进程使用管道

向子进程发送一个msg
#include <unistd.h>
#include <stdio.h>

int main(){
        int file_des[2];
        pipe(file_des);
        int ret = fork ;
        if (ret == -1)
                printf("error");
        else if (ret > 0 ){ //father
                close(file_des[0]);
                printf("im the father sending msg :) \n");
                        write(file_des[1],"nadav",6*sizeof(char));
                        waitpid(ret);
        }
        else{ // son
                char buffer[256];
                close(file_des[1]);
                printf("im the son reading dads msg :) \n");
                        read(file_des[0],buffer,6*sizeof(char));
                printf("dads msg is   %s\n",buffer);

        }
}

但是我收到以下错误(使用gdb运行):

Program received signal SIGPIPE, Broken pipe.
0x00007ffff7b00870 in __write_nocancel () at ../sysdeps/unix/syscall-template.S:81
81  ../sysdeps/unix/syscall-template.S: No such file or directory.

这里的问题在哪里?我做错了什么?

1 个答案:

答案 0 :(得分:2)

我猜问题就在这里

int ret = fork ;

而不是像int ret = fork();这样的函数调用,而是为ret变量分配一个函数指针,该变量隐式转换为int。现在你的程序就像一个父进程,但它实际上并没有产生任何子进程。你关闭管道的读取端并且没有读取器写入管道。