我有一个简单程序的以下代码,其中一个父进程使用管道
向子进程发送一个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.
这里的问题在哪里?我做错了什么?
答案 0 :(得分:2)
我猜问题就在这里
int ret = fork ;
而不是像int ret = fork();
这样的函数调用,而是为ret
变量分配一个函数指针,该变量隐式转换为int
。现在你的程序就像一个父进程,但它实际上并没有产生任何子进程。你关闭管道的读取端并且没有读取器写入管道。