C: `ошибка записи: неверный дескриптор файла` после fork, dup2 и execv - PullRequest
0 голосов
/ 11 марта 2011

Продолжаем эту проблему , но я повторю:

Для выполнения домашнего задания я должен написать базовую оболочку, включая перенаправление. Программа использует readline для запроса ввода, анализирует входную строку и разбивает ее на имя исполняемого файла, аргументы и файл (ы) ввода / вывода, если это применимо. После разбора строки он и дочерние execv () переходят в исполняемый файл, который был передан. Я использую dup2 () для изменения файловых дескрипторов после разветвления и перед execv, но у меня возникла проблема, как только Программа имеет execv'd для нового исполняемого файла. Если в моей оболочке я запускаю ls > foo.out, я получаю: ls: write error: Bad file descriptor

Вот код моего дочернего процесса (это после fork ()):

int _child(struct command *c){
    int ret;
    /* When given `ls > foo.out`, these next two lines output:
    ** c->infile is (null)
    ** c->outfile is foo.out
    */
    printf("c->infile is %s\n",c->infile);
    printf("c->outfile is %s\n",c->outfile);
    if(c->infile){
        int fd = open( c->infile, O_RDONLY);
        int _fd_dup = dup2(fd,0);
        close(0);
        if(_fd_dup != 0){
            fprintf(stderr, "Failed to redirect command input.\n");
            return 0;
        }
    }
    if(c->outfile){
        int fd = open( c->outfile, O_WRONLY | O_CREAT | O_TRUNC, 0600);
        int _fd_dup = dup2(fd,1);
        close(1);
        if(_fd_dup != 1){
            fprintf(stderr, "Failed to redirect command output.\n");
            return 0;
        }
    }

Я не получаю сообщение «Не удалось перенаправить вывод команды». ошибка. Как я уже говорил, это домашнее задание, поэтому я не ищу никого, кто мог бы это исправить, а скорее указал мне правильное направление.

1 Ответ

2 голосов
/ 11 марта 2011

Проблема в этом бите кода:

    int _fd_dup = dup2(fd,1);
    close(1);

Вы должны закрывать fd, а не 1. У вас такая же проблема и в случае с fd 0.

...