c - execvp() 创建一个基于 unix shell 的小程序

标签 c shell unix

我制作了一个小程序,它 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/

相关文章:

c - 这种变量分配是如何工作的?

linux - 从一个文件中随机选择几行,然后从第二个文件中选择相同的行号

linux - __LINE__ 相当于 Linux shell

unix - 解释awk命令

c++ - 检查是否在 unix 中加载了共享对象

linux - Wget 能否返回 true 或 false(0 或 1)

c - 我的代码使用除法运算符不起作用

c - 我对 KandR C ex1-21 entab 的尝试需要帮助

c - 哪里可以下载CCured?

ruby - 读取 ruby​​ 中的所有 shell 变量