C:`write error:fork,dup2和execv之后的错误文件描述符`

时间:2011-03-11 03:49:17

标签: c exec fork file-descriptor

继续this problem,但我会重申:

对于家庭作业,我必须编写一个基本的shell,包括重定向。该程序使用readline来提示输入,解析输入字符串,并将其分解为可执行文件名,参数和输入/输出文件(如果适用)。在解析字符串之后,它将forx和子execv()传递给传入的可执行文件。我使用dup2()在fork之后和execv之前更改文件描述符,但是一旦遇到问题我就会遇到问题程序已执行新的可执行文件。如果在我的shell中运行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 个答案:

答案 0 :(得分:2)

问题在于这段代码:

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

您应该关闭fd,而不是1。在fd 0案例中你也有同样的问题。