首页 > 其他分享 >execve

execve

时间:2024-09-22 22:26:04浏览次数:7  
标签:NULL char ls env include 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;
}

标签:NULL,char,ls,env,include,execve
From: https://www.cnblogs.com/focusoncompiler/p/18426013

相关文章

  • [kernel] 带着问题看源码 —— 脚本是如何被 execve 调用的
    前言在《[apue]进程控制那些事儿》一文的"进程创建->exec->解释器文件"一节中,曾提到脚本文件的识别是由内核作为exec系统调用处理的一部分来完成的,并且有以下特性:指定解释器的以#! (shebang)开头的第一行长度不得超过128shebang最多只能指定一个参数shebang指......
  • execve()系统调用和elf装载过程
    在进入execve()系统调用之后,Linux内核就开始进行真正的装配工作。在内核中,execve()系统调用相应的入口是sys_execve()。sys_execve()进行一些参数的检查复制之后,调用do_execve()。do_execve()会首先查找被执行的文件,如果找到文件,则读取文件的前128个字节。文件的前128个字节保存着......
  • 系统调用 execve
    main.c#include<stdio.h>#include<unistd.h>#include<sys/wait.h>char*argv[]={"arg1","arg2",NULL};char*envp[]={"PATH=/bin","HOME=/root",NULL}......