繁体   English   中英

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

[英]Difference between exec, execvp, execl, execv?

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

command [arguments]

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

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

execexecvpexeclexecv ...我不知道使用哪一个以及为什么。

我目前的代码:

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 ;
    }
}

谢谢 !

尝试阅读手册: https//linux.die.net/man/3/execv

摘抄:

描述exec()系列函数用新的过程映像替换当前过程映像。 本手册页中描述的功能是execve(2)的前端。 (有关更换当前过程映像的更多详细信息,请参见execve(2)的手册页。)

这些函数的初始参数是要执行的文件的名称。

execl(),execlp()和execle()函数中的const char * arg和后续省略号可以被认为是arg0,arg1,...,argn。 它们一起描述了一个或多个指向以null结尾的字符串的指针的列表,这些字符串表示执行程序可用的参数列表。 按照惯例,第一个参数应指向与正在执行的文件关联的文件名。 参数列表必须由NULL指针终止,并且由于这些是可变参数函数,因此必须强制转换此指针(char *)NULL。

execv(),execvp()和execvpe()函数提供指向以null结尾的字符串的指针数组,这些字符串表示新程序可用的参数列表。 按照惯例,第一个参数应指向与正在执行的文件关联的文件名。 指针数组必须由NULL指针终止。

execle()和execvpe()函数允许调用者通过参数envp指定执行程序的环境。 envp参数是一个指向以null结尾的字符串的指针数组,必须由NULL指针终止。 其他功能从调用过程中的外部变量environ获取新过程映像的环境。

execlp()和execvp()的特殊语义

如果指定的文件名不包含斜杠(/)字符,则execlp(),execvp()和execvpe()函数会复制shell在搜索可执行文件时的操作。 在PATH环境变量中指定的以冒号分隔的目录路径名列表中查找该文件。 如果未定义此变量,则路径列表默认为当前目录,后跟confstr(_CS_PATH)返回的目录列表。 (此confstr(3)调用通常返回值“/ bin:/ usr / bin”。)

在C中你可以使用'system'命令。 这将执行您作为函数参数输入的内容。

这是一个例子:

system("ls -l");

如果要获取输出,可以重定向到其他源。

简介:在您的情况下,我建议使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM