我到处搜索过,唯一得知我会得到fdUp[READ]
的错误文件描述符的原因是我以前是否关闭过它。我不相信我已经这样做了,我也不知道为什么。
bool start_process(void) {
int fdDown[2];
int fdUp[2];
FILE* in;
FILE* out;
if(pipe(fdDown) && pipe(fdUp)) {
return false; //pipe failed
}
switch(fork()) {
case -1:
return false; //fork failed
case 0:
// child
close(fdDown[WRITE]);
dup2(fdDown[READ], STDIN_FILENO);
close(fdDown[READ]);
close(fdUp[READ]);
dup2(fdUp[WRITE], STDOUT_FILENO);
close(fdUp[WRITE]);
execlp("./process", "process1", (char *) 0);
return false; //exec failed
default:
//parent
close(fdDown[READ]);
out = fdopen(fdDown[WRITE], "w");
close(fdUp[WRITE]);
in = fdopen(fdUp[READ], "r");
if(in==NULL) printf("%s\n", strerror(errno)); //BAD FILE DESCRIPTOR
fprintf(out, "msg from parent\n");
fflush(out);
char buf[100];
fgets(buf, 100, in);
printf("%s", buf);
wait(NULL);
}
return true;
}
答案 0 :(得分:1)
由于初始化方式的原因,fdUp
中的描述符实际上是无效的。
if(pipe(fdDown) && pipe(fdUp)) {
return false; //pipe failed
}
如果pipe(fdDown)
成功(即返回0),则pipe(fdUp)
根本不会执行(由于short-circuit evaluation)。
你真的想要:
if(pipe(fdDown) || pipe(fdUp)) {
return false; //pipe failed
}
诊断更好的另一种方法是:
if(pipe(fdDown)) {
perror("pipe: fdDown");
return false;
}
if(pipe(fdUp)) {
perror("pipe: fdUp");
return false;
}