4.exec函数族
exec函数族是一组用于在进程中启动另一个程序来替换当前进程的函数。
exec函数族主要用于在当前进程内部执行一个新的程序,而不会创建新的进程。
- 子进程调用exec函数,族父进程不受影响。
- 进程当前内容被指定的程序替换,但进程号不变
exec函数族中的一些主要成员:
execl
:这是exec函数族中最简单的一个,它接受一个可执行文件路径和一个参数列表,列表以NULL结尾。这个函数将新程序的参数一一对应地传递给新程序。execv
:与execl
类似,但是参数是通过一个指针数组传递的,而不是直接列出。execlp
和execvp
:这两个函数会搜索PATH
环境变量来找到可执行文件,而不需要提供完整的路径名。
execl 函数
-
原型:
#include <unistd.h> int execl(const char *path, const char *arg, ...);
-
功能:
execl
函数用来执行一个文件,并将控制权转交给这个新程序。当调用成功时,原有进程的内容(代码段、数据段和堆栈等)将被新程序的内容取代,execl
函数不会返回。 -
参数:
path
:要执行的程序的路径。arg
:传递给新程序的参数列表,最后一个参数需要是NULL,以标识参数列表的结束。
-
返回值:
- 如果调用成功,
execl
函数不会返回。 - 如果调用失败(例如找不到指定的文件或没有足够的内存等),则返回-1,并设置
errno
来指示错误类型。
- 如果调用成功,
-
注:
execl
函数后面的字母“l”代表的是“list”,意味着该函数通过参数列表的方式来传递参数 -
示例:
使用
execl
函数来执行ls
命令#include <stdio.h> #include <unistd.h> int main(int argc, const char *argv[]) { if(execl("/bin/ls","ls","-a","-l","./",NULL)<0) { perror("execl"); } return 0; }
编译运行a.out 和 shell命令
$ls -a -l
做对比运行效果一致
execlp 函数
-
原型:
#include <unistd.h> int execlp(const char *file, const char *arg, ...);
-
功能:
execlp
函数用于在当前进程中执行指定的可执行文件,并用该新程序替换当前进程的映像。 -
参数:
file
:要执行的程序的文件名(或路径),不需要带扩展名,因为系统会自动根据文件名查找可执行文件。arg
:传递给新程序的参数列表,最后一个参数需要是NULL,以标识参数列表的结束。...
:可选参数,可以传递多个,每个参数都会按顺序传递给新程序。
-
返回值:
- 如果调用成功,
execlp
函数不会返回。 - 如果调用失败,则返回-1,并设置
errno
来指示错误类型。
- 如果调用成功,
execv 函数
-
原型:
#include <unistd.h> int execv(const char *path, char *const argv[]);
-
功能:
execv
函数用来执行一个文件,并将控制权转交给这个新程序。与execl
相似,当调用成功时,原有进程的内容(代码段、数据段和堆栈等)将被新程序的内容取代,execv
函数不会返回。 -
参数:
path
:要执行的程序的路径。argv
:传递给新程序的参数数组,其中argv[0]
通常是被执行文件的路径,数组的最后一个元素应该是NULL,以标识参数列表的结束。
-
返回值:
- 如果调用成功,函数不会返回。
- 如果调用失败,则返回-1,并设置
errno
来指示错误类型。
execvp 函数
-
原型:
#include <unistd.h> int execvp(const char *file, char *const argv[]);
-
功能:
execvp
函数用于在当前进程中执行指定的可执行文件,并用该新程序替换当前进程的映像。 -
参数:
file
:要执行的程序的文件名(或路径),不需要带扩展名,因为系统会自动根据文件名查找可执行文件。argv
:传递给新程序的参数数组,其中argv[0]
通常是被执行文件的路径,数组的最后一个元素应该是NULL,以标识参数列表的结束。
-
返回值:
- 如果调用成功,
execvp
函数不会返回。 - 如果调用失败,则返回-1,并设置
errno
来指示错误类型。
- 如果调用成功,
-
示例:
使用
execv
和execvp
函数来执行ls
命令#include <stdio.h> #include <unistd.h> int main(int argc, const char *argv[]) { char *arg[] = {“ls”, “-a”, “-l”, “/etc”, NULL}; if (execv(“/bin/ls”, arg) < 0) { perror(“execv”); } if (execvp(“ls”, arg) < 0) { perror(“execvp”); } return 0; }
运行效果同上
system 函数
-
原型:
#include <stdlib.h> int system(const char *command);
-
功能:
system
函数用于在当前进程中创建一个子进程,并在子进程中执行一个shell命令。该函数会等待命令执行完成后返回。 -
参数:
command
:指向以空字符终止的字符串的指针,该字符串包含要在子进程中执行的命令。
-
返回值:如果
system
函数成功执行了指定的命令,它将返回命令的退出状态。如果发生错误或命令无法执行,则返回-1。通常,返回值是shell的退出代码,可以通过WEXITSTATUS(status)
宏来获取。 -
注意:
system
函数的使用可能会带来安全风险,因为它允许执行任意的shell命令。因此,在安全性要求较高的环境中,应该避免使用system
函数,或者至少对输入的命令进行严格的检查和限制。 -
示例:
#include <studio.h> #include <stdlib.h> int main() { system("ls -a -l ./"); }