我编写了以下代码,以帮助我理解管道如何在C中工作。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
struct sum_ {
int a;
int b;
};
int main (void) {
int pipe1[2];
int pid;
struct sum_ sum;
if ( (pipe(pipe1) != 0)){
printf("pipe(): %d %s\n", errno, strerror(errno));
exit(1);
}
pid = fork();
if (pid == -1) {
printf("fork(): %d %s\n", errno, strerror(errno));
exit(1);
}
else if (pid == 0) { // Child
close(pipe1[0]);
sleep(5);
sum.a = read(pipe1[0], &sum.a, sizeof(sum.a));
printf("Your number was: %d", sum.a);
}
else { // Father
close(pipe1[1]);
printf("\nWrite a number: \n");
char a[4];
sum.a = atoi(fgets(a, 4, stdin));
write(pipe1[1], &sum.a, sizeof(sum.a));
}
return 0;
}
代码有一个父子进程。这很简单,父亲使用管道向儿子发送号码,儿子显示用户的号码。 结果总是得到-1。我做错了什么?
答案 0 :(得分:2)
close(pipe1[0]);
sleep(5);
sum.a = read(pipe1[0], &sum.a, sizeof(sum.a));
关闭文件描述符pipe1[0]
,然后从中读取(因此返回-1)。你也在父亲身上犯了同样的错误。我想你的意思是在这里关闭pipep1[0]
和在父亲
pipe1[1]
此外,当您修复此问题时,虽然您通过传递地址读取sum.a,但您也可以从返回值设置它,这将覆盖您阅读的内容。