Неверный дескриптор файла.ЗАЧЕМ? - PullRequest
0 голосов
/ 24 сентября 2018

Я искал везде, и единственная причина, по которой я знаю, что я получаю неверный файловый дескриптор для 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 голосов
/ 24 сентября 2018

Ваши дескрипторы в fdUp действительно недействительны из-за способа их инициализации.

   if(pipe(fdDown) && pipe(fdUp)) {
        return false; //pipe failed
    }

Если pipe(fdDown) завершится успешно (то есть вернет 0), тогда pipe(fdUp) не будет выполняться привсе (из-за оценки короткого замыкания ).Вы действительно хотите:

   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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...