Плохой дескриптор файла при использовании fdopen?

У меня есть следующий C-код. Ребенок используется для запуска test3, чей код будет ниже. Родитель используется для передачи данных дочернему элементу, которые будут перенаправлены в STDIN теста3.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char *argv[]) {
    int fd[2];
    char buf[] = "HELLO WORLD!";
    if(pipe(fd)){
      perror("pipe");
      return -1;
    }
    switch(fork()){
        case -1:
            perror("fork");
            return -1;
        case 0:
            // child
            close(fd[1]);
            dup2(fd[0], STDIN_FILENO);
            close(fd[0]);
            system("./test3");
        default:
            // parent
            close(fd[0]);
            FILE* stream = fdopen(fd[1],"w");
            if(stream == NULL){ // error checking
                printf("Error creating a file\n");
                printf("%s\n", strerror(errno));
                return -1;
            }
            // write data to pipe
            fwrite(buf, 1,6,stream);
            close(fd[1]);
            fclose(stream);
    }
    printf("END~\n");
    return 0;
}  

А вот код test3:

#include <stdio.h>
int main(){
     char n[1000];
     scanf("%s",n);
     printf("%s\n",n);
}

Моя проблема заключается в fdopen в коде родителя возвращает NULL с Bad file descriptor error и я не могу понять причины. Может кто-нибудь поможет?

Заранее спасибо.

1 ответ

Решение

Ошибка на самом деле исходит от ребенка, а не от родителя. После того, как ребенок бежит test3 с помощью системного вызова, он падает в default: случай, пытаясь fdopen дескриптор файла уже закрыт. добавлять break; после системного вызова и ошибка исчезнет.

Вторая проблема заключается в close(fd[1]) в родительском элементе, который закрывает дескриптор файла из-под указателя FILE, прежде чем сбрасывает данные, которые вы записали fwrite, Либо положить fflush(stream); позвонить до close или просто избавиться от closeкак fclose закроет дескриптор файла.

Другие вопросы по тегам