C-Execvp() 总是失败
C-Execvp() always fails
我正在尝试在 c 中创建一个 shell,目前正在尝试 ls 命令,但是 child 总是 returns 而 execvp
无法工作。这是 function.first 我得到我所在的路径和我使用 exec 从 stdin
获得的命令这就是为什么我在复制命令并使用 strtok
(分隔符是“”)我将所有参数放在execv
和"close it"的数组中,并带有一个空终止字符串,然后我打印给出正确输出的数组元素ex(ls -l give ls "newline" -l) 然后我打印也给出正确输出的路径 (/home/usr_name/Desktop)。但是 execv
从不工作,它 returns fprintf
void ls(char* path,char* cmd){
int pid,elements,l,i=0;;
l=strlen(cmd);
if(cmd[l-1]=='\n'){
cmd[l-1]='[=11=]';
}
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]='[=11=]';
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 中创建一个 shell,目前正在尝试 ls 命令,但是 child 总是 returns 而 execvp
无法工作。这是 function.first 我得到我所在的路径和我使用 exec 从 stdin
获得的命令这就是为什么我在复制命令并使用 strtok
(分隔符是“”)我将所有参数放在execv
和"close it"的数组中,并带有一个空终止字符串,然后我打印给出正确输出的数组元素ex(ls -l give ls "newline" -l) 然后我打印也给出正确输出的路径 (/home/usr_name/Desktop)。但是 execv
从不工作,它 returns fprintf
void ls(char* path,char* cmd){
int pid,elements,l,i=0;;
l=strlen(cmd);
if(cmd[l-1]=='\n'){
cmd[l-1]='[=11=]';
}
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]='[=11=]';
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);