exec、execvp、execl、execv 之间的区别?

use*_*490 4 c linux process exec execvp

我正在编写一个代表 Linux 新 shell 的代码。我想要支持的命令之一是运行一个进程,例如,如果我得到以下行

command [arguments]

然后我想command作为一个进程运行,直到它完成运行该进程。

为此,我知道我需要使用fork()它来获取子进程并获取它的 PID,我的问题是我不知道它们之间有什么区别:

exec, execvp, execl, execv... 我不知道该使用哪个以及为什么。

我目前的代码:

void External_Process(char *arguments[MAX_ARG], char* command)
{
    int pID;
    switch(pID = fork())
    {
    case -1:
        perror("fork failed");
        break;
    case 0 :
        setpgrp();

        //execv(command, arguments);
        //execvp(command, arguments);
        //execl("/bin/bash", "/bin/bash","-c",command,NULL);

        printf("smash error: > bad command %s\n" , command);
        exit(-1) ;

        break;

    default:
        return ;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢 !

Bod*_*odo 8

总结:在你的情况下,我建议使用execvp.

要找出exec*功能之间的差异,您应该阅读文档:
https : //linux.die.net/man/3/exec
https://linux.die.net/man/2/execve

execl*和之间的区别execv*是参数传递。execl*需要参数列表,同时execv*需要参数向量。
如果您在编译时知道所有参数,则参数列表很有用。在您的情况下,参数将由用户输入,您必须在运行时构造参数向量,因此您应该使用其中一个execv*函数。

带有后缀的函数p使用PATH环境变量来查找程序(例如"ls"),否则您必须指定完整路径(相对于当前目录的绝对路径或相对路径,例如"/bin/ls")。使用PATH是 shell 通常所做的,所以这对你来说似乎是正确的选择。

带有后缀的函数e允许指定进程的环境。为简单起见,我不会在您的情况下使用它。

由此得出结论: execvp

当然,你也可以使用system(而不是fork/ exec*/wait*在vladxjohn的答复中提到),但在这种情况下,你只会使用shell来解释你的命令,而不是实现一个基本的外壳。