目录
glibc
execve()
执行由 pathname
指定的程序。这会导致当前正在被调用进程运行的程序被一个新程序替换,且该新程序会重新初始化栈、堆,以及(已初始化和未初始化的)数据段。
demo
execve(path, args, env):用 execve() 替换当前进程为 ls 命令。如果 execve() 执行成功,当前进程的内存和代码会被 ls 替换,所以之后的 printf 不会被执行。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
// 要执行的程序路径
char *path = "/bin/ls";
// 传递给 ls 的参数列表(第一个参数通常是命令的名称本身,后面是选项和参数)
char *args[] = {"ls", "-l", NULL}; // 参数数组,最后一个必须是 NULL
// 环境变量(可以传递 NULL 使用当前的环境变量)
char *env[] = {NULL}; // 环境变量数组,最后一个必须是 NULL
// 调用 execve 来执行 ls 命令
if (execve(path, args, env) == -1) {
// 如果 execve 失败,打印错误信息并退出
perror("execve failed");
exit(EXIT_FAILURE);
}
// execve 成功后,这行代码将不会执行,因为当前进程已经被 ls 替换
printf("This line will not be printed if execve succeeds\n");
return 0;
}
标签:NULL,char,ls,env,include,execve
From: https://www.cnblogs.com/focusoncompiler/p/18426013