zoukankan      html  css  js  c++  java
  • Linux exec函数族

    1. 概念:

    exec函数族提供了一种在进程中启动另一个程序执行的方法。
    它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、
    代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了

    2. 何时使用exec?

    1)当进程认为自己不能再为系统和用户做出任何贡献了时就可以调用exec函数,让自己执行新的程序

    2)如果某个进程想同时执行另一个程序,它就可以调用fork函数创建子进程,然后在子进程中调用任何一个exec函数。
      这样看起来就好像通过执行应用程序而产生了一个新进程一样

    3.相关函数:
      int execl(const char *path, const char *arg, ...);
      int execv(const char *path, char *const argv[]);
      int execle(const char *path, const char *arg, ..., char *const envp[]);
      int execve(const char *path, char *const argv[], char *const envp[]);
      int execlp(const char *file, const char *arg, ...);
      int execvp(const char *file, char *const argv[]);
      l : list列表,参数要以列表形式,展现出来。
      p : path路径,从系统环境变量中去找可执行文件
      v : 向量数组,将列表的参数装到数组中去。
      e : 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。envp也是一个以NULL结尾的字符串数组指针


    4.使用区别:
    1)可执行文件查找方式
      无p:指定完整的文件目录路径,
      有p:只给出文件名,系统会自动从环境变量“$PATH”所包含的路径中进行查找。
    2)参数表传递方式
      有l:表示逐个列举的方式;
      有v:表示将所有参数构造成指针数组传递,其语法为char *const argv[]
    3)环境变量的使用
      exec函数族可以默认使用系统的环境变量,也可以传入指定的环境变量。
      这里,以“e”(Enviromen)结尾的两个函数execle、execve就可以在envp[]中传递当前进程所使用的环境变量,一般为NULL即可

    例子:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    /*
    int execl(const char *path, const char *arg, ...);
    int execlp(const char *file, const char *arg, ...);
    int execle(const char *path, const char *arg,
            ..., char * const envp[]);
    int execv(const char *path, char *const argv[]);
    int execvp(const char *file, char *const argv[]);
    int execvpe(const char *file, char *const argv[],
            char *const envp[]);
    */
    
    
    int main(int argc, const char *argv[])
    {
        // 1
        execl("/bin/ls","ls","-l",NULL);
        printf("AAAA
    ");
    // 2 execlp("ls","ls","-l",NULL); // 3 char *buf[] = {"ls","-l",NULL}; execv("/bin/ls",buf); return 0; }

    测试: 只有1 会执行,后面的都不执行, 因为exec启动的进程取代了原来的 数据段,代码段,堆栈段 printf 也不会执行

  • 相关阅读:
    Python的传递引用
    kafka的ACK
    分布式事务
    Java中的锁
    docker笔记
    MySQL数据库优化
    Centos7使用yum命令安装Mysql5.6.X
    ubuntu16.04安装workbench
    ubuntu下IDEA配置tomcat报错Warning the selected directory is not a valid tomcat home
    ubuntu配置JDK
  • 原文地址:https://www.cnblogs.com/electronic/p/10932525.html
Copyright © 2011-2022 走看看