我制作了一个小程序,它 fork 并执行另一个程序。基本上它应该像 unix shell 一样工作。
这是我的代码:
int main(int argc, char *argv[]){
pid_t cpid;
char *shell[5];
shell[0]=argv[1];
shell[1]=argv[2];
shell[2]=argv[3];
shell[4]=NULL;
if(argc!=4){
printf("Program expects 4 arguments");
} else{
cpid=fork();
if(cpid==0){
execvp("/bin/sh",shell);
}//end child process
if (cpid != wait(NULL)) { /* parent code */
printf("Parent failed to wait");
return 1;
}
}//end else
}//end main
但是,当我发出命令时
$ ./shell simple sml_prog1 A
它说 sml_prog1 not found
大约 15 或 20 次。
shell 应该运行 simple
,它将 sml_prog1 A
作为参数。
该程序使用相同的参数独立运行。
我将 sml_prog1
的权限更改为 read/write/executable
。此外,sml_prog1
是一个 .txt
文件,其中包含 simple
程序使用的数据
最佳答案
主要问题是您如何调用 execvp
。你不想执行/bin/sh
,你想执行用户传入的程序,即argv[1]
。
更改对此的调用,并添加以下错误检查:
execvp(shell[0],shell);
perror("exec failed"); // This line never gets called unless execvp fails
exit(1); // end the child process
此外,您永远不会将 shell[3]
设置为任何值。您可能希望将其设置为 NULL 而不是 shell[4]
:
shell[0]=argv[1];
shell[1]=argv[2];
shell[2]=argv[3];
shell[3]=NULL;
关于c - execvp() 创建一个基于 unix shell 的小程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33015575/