错误的文件描述符。为什么?

时间:2018-09-24 15:35:19

标签: c unix

我到处搜索过,唯一得知我会得到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;
}

1 个答案:

答案 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;
    }