execve

目录

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;
}

posted @ 2024-09-22 22:11  攀登者1998  阅读(51)  评论(1)    收藏  举报