gpt4 book ai didi

C: execv 之前的 dup2()

转载 作者:行者123 更新时间:2023-11-30 14:29:05 25 4
gpt4 key购买 nike

对于家庭作业,我必须编写一个包括重定向在内的基本 shell。该程序使用 readline 提示输入,解析输入字符串,并将其分解为可执行文件名称、参数和输入/输出文件(如果适用)。解析字符串后,它 fork 并将子 execv() 传递给传入的可执行文件。我使用 dup2() 来更改 fork 之后和 execv 之前的文件描述符,但是一旦程序已 execv'd 为新的可执行文件。如果在我的 shell 中运行 ls > foo.out,我会得到: ls: 无法访问 H��y�A�
$ L��H)�I�$�: 没有这样的文件或目录

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);

最佳答案

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

<小时/>

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

关于C: execv 之前的 dup2(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5268583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com