Linux- execve()
最佳答案 问答题库538位专家为你答疑解惑
execve()
是 Linux/UNIX 中的 exec
函数家族中的一个,它允许进程执行一个新的程序。具体地,execve()
替换当前进程的映像为新的程序映像。
函数原型如下:
int execve(const char *pathname, char *const argv[], char *const envp[]);
pathname
: 要执行的程序的路径。argv
: 是一个字符串数组,表示要传递给新程序的参数列表。通常第一个参数 (argv[0]
) 是程序的名称。这个列表必须以 NULL 指针结束。envp
: 是一个环境变量的字符串数组,代表新程序的环境。也必须以 NULL 指针结束。
如果 execve()
成功,它不会返回,因为调用进程的代码和数据已被新程序替换。如果出现错误,它会返回 -1
并设置适当的 errno
。
示例
在这个示例中,我们将尝试执行 /bin/ls
命令,列出当前目录的内容,并传递两个参数给它:-l
(表示长格式)和 -a
(表示列出所有文件,包括隐藏文件)。
#include <stdio.h>
#include <unistd.h>int main() {char *pathname = "/bin/ls"; // 要执行的程序的路径char *argv[] = { "ls", "-l", "-a", NULL }; // 参数列表char *envp[] = { "PATH=/bin:/usr/bin", "TERM=xterm", NULL }; // 环境变量,只是为了示例printf("Executing ls...\n");if (execve(pathname, argv, envp) == -1) {perror("execve failed");return 1;}// 如果 execve() 成功,以下代码将不会执行printf("This won't be printed if execve is successful\n");return 0;
}
在此示例中,如果 execve()
调用成功,ls
命令将会执行,并且“This won't be printed if execve is successful
”这行代码将不会执行,因为原始程序的映像已被 ls
命令替换。如果 execve()
失败,它会返回 -1
,然后将会打印一个错误消息,并显示“This won't be printed if execve is successful
”。
majn@tiger:~/C_Project/process_project$ ./execve_demo
total 152
drwxrwxr-x 3 majn majn 4096 Sep 17 16:34 .
drwxrwxr-x 5 majn majn 4096 Sep 17 10:21 ..
drwxrwxr-x 2 majn majn 4096 Sep 17 15:03 .vscode
-rwxrwxr-x 1 majn majn 16088 Sep 17 16:34 atexit_demo
-rw-rw-r-- 1 majn majn 345 Sep 17 16:34 atexit_demo.c
-rwxrwxr-x 1 majn majn 16112 Sep 17 16:06 errno_demo
-rw-rw-r-- 1 majn majn 284 Sep 17 16:07 errno_demo.c
-rwxrwxr-x 1 majn majn 16056 Sep 17 10:56 exec_demo
-rw-rw-r-- 1 majn majn 160 Sep 17 10:56 exec_demo.c
-rwxrwxr-x 1 majn majn 16144 Sep 17 11:14 execve_demo
-rw-rw-r-- 1 majn majn 410 Sep 17 11:14 execve_demo.c
-rwxrwxr-x 1 majn majn 16096 Sep 17 10:25 fork_demo
-rw-rw-r-- 1 majn majn 343 Sep 17 10:25 fork_demo.c
-rwxrwxr-x 1 majn majn 16272 Sep 17 15:22 status_demo
-rw-rw-r-- 1 majn majn 837 Sep 17 15:22 status_demo.c
-rwxrwxr-x 1 majn majn 16312 Sep 17 15:11 waitpid_demo
-rw-rw-r-- 1 majn majn 840 Sep 17 15:11 waitpid_demo.c
char *envp[] = { “PATH=/bin:/usr/bin”, “TERM=xterm”, NULL }; 这是一个环境变量的数组,用于传递给被 execve()
执行的程序。当一个程序运行时,它接收到了一个环境变量的集合,这些变量可以被用来影响程序的行为或配置。
在给出的数组中:
-
"PATH=/bin:/usr/bin"
:PATH
是一个环境变量,用于指示 shell 和其他程序在哪里查找可执行文件。值/bin:/usr/bin
是一个冒号分隔的目录列表,当用户或程序尝试运行一个命令但没有指定其完整路径时,系统会在这些目录中查找该命令。 -
"TERM=xterm"
:TERM
是一个环境变量,用于指示当前终端的类型。这对于那些需要知道如何与终端互动的程序(例如文本编辑器或分页器)是有用的。在这种情况下,它被设置为xterm
,这是一个常见的终端类型。 -
NULL
: 这是数组的结束标志,它告诉execve()
在哪里停止读取环境变量。
需要注意的是,当你在日常使用 shell 时,许多环境变量(如 PATH
, HOME
, LANG
等)已经被设置并传递给你运行的每个程序。但在 execve()
中,你必须明确地提供你想要传递给新程序的环境变量列表,否则它不会继承任何环境变量。
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Linux- execve()":http://eshow365.cn/6-10286-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!