我正在尝试用 c 语言创建一个 shell,当前正在尝试 ls 命令,但子进程总是返回 execvp
无法工作。这是函数。首先,我使用 exec 获取我所在的路径和从 stdin
获取的命令,这就是为什么我在复制命令并使用 strtok< 后删除换行符的原因
(分隔符是“”)我将所有参数放入 execv
的数组中,并用空终止字符串“关闭它”,然后打印给出正确输出的数组元素ex(ls -l 给出 ls "newline"-l) 然后我打印路径,该路径也给出正确的输出(/home/usr_name/Desktop)。但是 execv
永远不会工作,它返回 fprintf
void ls(char* path,char* cmd){
int pid,elements,l,i=0;;
l=strlen(cmd);
if(cmd[l-1]=='\n'){
cmd[l-1]='\0';
}
char* ccmd=strdup(cmd);
char* t_cmd;
char* w_cmd[1024];
t_cmd=strtok(ccmd,DELIM);
while(t_cmd!=NULL){
w_cmd[i]=t_cmd;
t_cmd=strtok(NULL,DELIM);
i++;
}
w_cmd[i]='\0';
elements=i;
for(i=0;i<elements;i++){
printf("%s\n",w_cmd[i] );
}
printf("%s\n",path);
pid=fork();
if(pid==0){
execvp(path,w_cmd);
fprintf(stderr, "Child process could not do execvp\n");
}
else{
wait(NULL);
printf("Child exited\n");
}
}
最佳答案
你说path
等于“/home/usr_name/Desktop”
(当然是你的真实用户名)?
那么这就是问题所在。如果你read an exec
manual page它会告诉您第一个参数是您应该执行的命令。
因此,要使用 execvp
执行 ls -l
,您应该执行以下操作:
char *w_cmd[] = { "ls", "-l", NULL };
execvp(w_cmd[0], w_cmd);
关于C-Execvp() 总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40162541/