gpt4 book ai didi

C-Execvp() 总是失败

转载 作者:行者123 更新时间:2023-11-30 19:37:13 26 4
gpt4 key购买 nike

我正在尝试用 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/

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