首页 文章

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

提问于
浏览
0

继续this problem,但我会重申:

对于家庭作业,我必须编写一个包括重定向的基本shell . 该程序使用readline来提示输入,解析输入字符串,并将其分解为可执行文件名,参数和输入/输出文件(如果适用) . 在解析字符串之后,它使用dup2()分叉和子execv()'s to the executable that was passed in. I' m来更改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 回答

  • 2

    问题在于这段代码:

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

    你应该关闭 fd ,而不是 1 . 在fd 0情况下你也有同样的问题 .

相关问题