exec、execvp、execl、execv之间的差异?
我正在编写一段代码,表示Linux的一个新shell。我想要支持的命令之一是运行进程 例如,如果我得到以下行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)
命令[参数]
然后我想作为一个进程运行命令
,直到它完成该进程的运行
为此,我知道我需要使用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。可能重复、、等。