gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:01:37 24 4
gpt4 key购买 nike

我正在编写代表 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 ;
}
}

谢谢!

最佳答案

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

要找出 exec* 函数之间的区别,您应该阅读文档:
https://linux.die.net/man/3/exec
https://linux.die.net/man/2/execve

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

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

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

由此得出结论:execvp

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

关于c - exec、execvp、execl、execv 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55743496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com