当前位置: 首页 > news >正文

Linux- execve()

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() 中,你必须明确地提供你想要传递给新程序的环境变量列表,否则它不会继承任何环境变量。

http://www.lryc.cn/news/171301.html

相关文章:

  • 007 数据结构_堆——“C”
  • zabbix的原理与安装
  • ReactNative中升级IOS 17版本Crash解决
  • MongoDB详解
  • 【SpringCloud微服务全家桶学习笔记-服务注册zookeeper/consul】
  • 【滑动窗口】LCR 016. 无重复字符的最长子串
  • C++中将类成员函数作为变量传递给函数
  • 2024届数字IC设计秋招面经-鼎信
  • 【数据结构】二叉树的节点数,叶子数,第K层节点数,高度,查找x节点,判断是否为完全二叉树等方法
  • 前馈神经网络(FFNN)和多层感知机(MLP)
  • EasySwipeMenuLayout - 独立的侧滑删除
  • 优麒麟下载、安装、体验
  • Appium混合页面点击方法tap的使用
  • 求解灰度直方图,如何绘制灰度直方图(数字图像处理大题复习 P1)
  • 8种结构型设计模式对比
  • 【PX4】Ubuntu20.04+ROS Noetic 配置PX4-v1.12.2和Gazebo11联合仿真环境【教程】
  • msvcp120.dll丢失怎么办?(五种方法快速解决)
  • eslint写jsx报错
  • 最新适合小白前端 Javascript 高级常见知识点详细教程(每周更新中)
  • 积分值和面积、对称性
  • springboot 整合es
  • MyBatisPlus使用自定义JsonTypeHandler实现自动转化JSON
  • LeetCode 2097. 合法重新排列数对【欧拉通路,DFS】2650
  • 学习笔记-接口测试(postman、jmeter)
  • 如何高效批量查询快递单号,提高工作效率?
  • 12万汉语源流词典汉字记性ACCESS\EXCEL数据库
  • 深度解剖数据在队列的应用
  • IMX6ULL移植篇-Linux内核源码目录分析二
  • 汽车行业数据治理方案,助力车企研产供销数据一体化
  • canvas-绘图库fabric.js简介