Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
exec、execvp、execl、execv之间的差异?_C_Linux_Process_Exec_Execvp - Fatal编程技术网

exec、execvp、execl、execv之间的差异?

exec、execvp、execl、execv之间的差异?,c,linux,process,exec,execvp,C,Linux,Process,Exec,Execvp,我正在编写一段代码,表示Linux的一个新shell。我想要支持的命令之一是运行进程 例如,如果我得到以下行 命令[参数] 然后我想作为一个进程运行命令,直到它完成该进程的运行 为此,我知道我需要使用fork()来获取子进程并获取其PID,我的问题是我不知道以下两者之间的区别: exec,execvp,execl,execv。。。我不知道该用哪一个,为什么 我当前的代码: void External_Process(char *arguments[MAX_ARG], char* command)

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

命令[参数]

然后我想作为一个进程运行
命令
,直到它完成该进程的运行

为此,我知道我需要使用
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 ;
    }
}
谢谢大家!

试着阅读手册:

摘录:

描述 exec()函数族用新的进程映像替换当前进程映像。本手册页面中描述的功能是Exeve(2)的前端。(有关替换当前进程映像的更多详细信息,请参阅Exeve(2)的手册页。)

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

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

execv()、execvp()和execvpe()函数提供指向以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*
函数之间的差异,您应该阅读文档:

execl*
execv*
之间的区别在于参数传递
execl*
需要参数列表,而
execv*
需要参数向量。
如果您在编译时知道所有参数,那么参数列表非常有用。在您的情况下,参数将由用户输入,您必须在运行时构造参数向量,因此您应该使用
execv*
函数之一

后缀为
p
的函数使用
PATH
环境变量来查找程序(例如
“ls”
),否则必须指定完整路径(绝对路径或相对于当前目录,例如
“/bin/ls”
)。使用
PATH
是Shell通常的做法,因此这似乎是您的正确选择

后缀为
e
的函数允许指定进程的环境。为了简单起见,我不会在你的情况下使用这个

由此得出结论:
execvp

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

可能重复、、等。