自己做都网站怎么发朋友圈,163cm邮箱登录入口,脱贫地区农副产品网络销售平台,详细网络设计方案execve() 是 Linux/UNIX 中的 exec 函数家族中的一个#xff0c;它允许进程执行一个新的程序。具体地#xff0c;execve() 替换当前进程的映像为新的程序映像。
函数原型如下#xff1a;
int execve(const char *pathname, char *const argv[], char *const envp[]);pathn…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.hint main() {char *pathname /bin/ls; // 要执行的程序的路径char *argv[] { ls, -l, -a, NULL }; // 参数列表char *envp[] { PATH/bin:/usr/bin, TERMxterm, NULL }; // 环境变量只是为了示例printf(Executing ls...\n);if (execve(pathname, argv, envp) -1) {perror(execve failed);return 1;}// 如果 execve() 成功以下代码将不会执行printf(This wont be printed if execve is successful\n);return 0;
}在此示例中如果 execve() 调用成功ls 命令将会执行并且“This wont be printed if execve is successful”这行代码将不会执行因为原始程序的映像已被 ls 命令替换。如果 execve() 失败它会返回 -1然后将会打印一个错误消息并显示“This wont be printed if execve is successful”。
majntiger:~/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.cchar *envp[] { “PATH/bin:/usr/bin”, “TERMxterm”, NULL }; 这是一个环境变量的数组用于传递给被 execve() 执行的程序。当一个程序运行时它接收到了一个环境变量的集合这些变量可以被用来影响程序的行为或配置。
在给出的数组中 PATH/bin:/usr/bin: PATH 是一个环境变量用于指示 shell 和其他程序在哪里查找可执行文件。值 /bin:/usr/bin 是一个冒号分隔的目录列表当用户或程序尝试运行一个命令但没有指定其完整路径时系统会在这些目录中查找该命令。 TERMxterm: TERM 是一个环境变量用于指示当前终端的类型。这对于那些需要知道如何与终端互动的程序例如文本编辑器或分页器是有用的。在这种情况下它被设置为 xterm这是一个常见的终端类型。 NULL: 这是数组的结束标志它告诉 execve() 在哪里停止读取环境变量。
需要注意的是当你在日常使用 shell 时许多环境变量如 PATH, HOME, LANG 等已经被设置并传递给你运行的每个程序。但在 execve() 中你必须明确地提供你想要传递给新程序的环境变量列表否则它不会继承任何环境变量。