C:execv之前的dup2()

时间:2011-03-11 03:15:05

标签: c exec fork file-descriptor

对于家庭作业,我必须编写一个基本的shell,包括重定向。该程序使用readline来提示输入,解析输入字符串,并将其分解为可执行文件名,参数和输入/输出文件(如果适用)。在解析字符串之后,它将forx和子execv()传递给传入的可执行文件。我使用dup2()在fork之后和execv之前更改文件描述符,但是一旦遇到问题我就会遇到问题程序已执行新的可执行文件。如果在我的shell中运行ls > foo.out,我会得到:ls: cannot access H��y�A� $ L��H)�I��$�: No such file or directory

构建c-> argv:

char *args[6];

int i;
for(i=0;i<=4;i++){
    char *_arg=strsep(&_str_cmd," ");
    printf("Found _arg: %s\n",_arg);

    // If there is an argument and it is not blank
    if(_arg && strcmp(_arg,"")!=0){
        if(strcmp(_arg,"<")==0){
            _cmd.infile=strsep(&_str_cmd," ");
            i--;
            continue;
        }
        else if(strcmp(_arg,">")==0){
            _cmd.outfile=strsep(&_str_cmd," ");
            i--;
            continue;
        }
    }
    else{break;}
}
args[i]=(char*)0;

_cmd.binary=args[0];
memcpy(_cmd.argv,args,sizeof _cmd.argv);

1 个答案:

答案 0 :(得分:2)

你是如何构建c->argv的?它必须是NULL - 终止的char *数组。你很可能错过了终结者。


在您的代码处理<...>...中,您跳过argv中的条目,使其保持未初始化状态。