c - exec,execvp,execl,execv之间的区别?
问题描述
我正在编写一个代表 Linux 新外壳的代码。我想要支持的命令之一是运行一个进程,例如,如果我得到以下行
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 ;
}
}
谢谢 !
解决方案
摘要:在您的情况下,我建议使用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 来解释您的命令,而不是实现基本 shell。