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

    exec函数族

    让父子进程执行不相干的操作

    能够替换进程地址空间中的源代码.txt段

    当前程序中调用另外一个应用程序

    是否需要exec函数族判断: 首先考虑exec之前需要fork

    返回值: (1) 如果函数执行成功, 不返回; (2) 执行失败, 打印错误信息, 退出当前进程

    头文件: #include <unistd.h>

    系统环境变量: extern char **environ;

    执行指定目录下的程序

    int execl(const char *path, const char *arg, ...); 常用
    一般执行自己写的程序
    参数:
      path: 要执行的程序的绝对路径
      变参args: 要执行的程序的需要的参数
        第一arg: 占位, 任意, 不能为空, 一般写执行程序名
        后边的arg: 命令的参数
        参数写完之后: NULL

    execl("/home/robin/a.out", "a.out", NULL);
    

    int execv(const char *path, char *const argv[]);
    参数:

    char* argv[] = {"a.out", NULL};
    execv("/home/robin/a.out", argv);
    

    执行PATH环境变量能够搜索到的程序

    int execlp(const char *file, const char *arg, ...); 常用
    执行系统自带的程序, 即不需用绝对路径
    参数:
      file: 执行的命令的名字
      变参arg:
        第一arg: 占位
        后边的arg: 命令的参数
        参数写完之后: NULL
        execpl执行自定义的程序: file参数绝对路径
    示例

    execlp("ls", "ls", "-la", NULL);
    

    int execvp(const char *file, char *const argv[]);
    示例

    char* arg[] = {"ls", "-a", "-l", NULL};
    execvp("ls", arg);
    

    执行指定路径, 指定环境变量下的程序

    int execle(const char *path, const char *arg, ..., char * const envp[]);
    从用户指定的目录中搜索指定的命令
    参数:
      path: 执行的程序的绝对路径
      arg: 执行的程序的参数
      envp: 用户自己指定的搜索目录, 代替PATH
    示例

    char* env[] = {"/bin", "./", "/home/robin", NULL};	// 自己指定环境变量,对应PATH
    execle("/bin/ls", "ls", "-l", "-a", NULL, env);
    

    int execve(const char *filename, char *const argv[], char *const envp[]);
    示例

    char* argv[] = {"ps", "a", "u", "x", NULL};
    char* env[] = {"/bin", "/home/", "./", NULL};
    execve("/bin/ps", argv, env);
    

    实例程序

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    int main(int argc, char *argv[]) {
    	pid_t pid;
    
    	pid = fork();
    	if(pid == -1) {
    		perror("fork");
    		exit(1);
    	}
    
    	if(pid == 0) {
    		// 子进程执行另外一个程序
    #if 0
    // ++++++++++++++++++++ execl ++++++++++++++++++++
    /*
     * int execl(const char *path, const char *arg, ...);
     		函数描述:加载一个进程,通过路径 + 程序名来加载。
     		函数参数:
     			path:程序路径+程序名字
     			arg:可执行程序的相关参数,使用NULL结尾
     		返回值:
    			成功:无返回
    			失败:-1
     */
    		// 子进程执行指定目录下的自己编写的程序,该程序参数
    		printf("this is func +++++++++ execl +++++++++
    ");
    		execl("/home/robin/a.out", "a.out", NULL);
    		// 如果执行成功没有返回值
    		perror("execl");
    		exit(1);
    #endif
    
    #if 0
    // ++++++++++++++++++++ execlp ++++++++++++++++++++
    /*
     * int execlp(const char *file, const char *arg, ...);
    		函数描述:加载一个进程,借助PATH环境变量,该函数需要配合PATH环境变量来使用,
    						  当PATH中所有目录搜索后没有参数1则出错返回
    		函数参数:可执行程序的相关参数,使用NULL结尾
    			file:可执行程序的名字
    			arg:可执行程序的相关参数,使用NULL结尾
    		返回值:
    			成功:无返回
    			失败:-1
     */
    		printf("this is func +++++++++ execlp +++++++++
    ");
    		execlp("ls", "ls", "-la", NULL);
    		// 如果执行成功没有返回值
    		perror("execlp");
    		exit(1);
    #endif
    
    #if 0
    // ++++++++++++++++++++ execvp ++++++++++++++++++++
    /*
     * int execvp(const char *file, char *const argv[]);
    		用法同 execlp
     */
    		printf("this is func +++++++++ execvp +++++++++
    ");
    		char* arg[] = {"ls", "-a", "-l", NULL};
    		execvp("ls", arg);
    		// 如果执行成功没有返回值
    		perror("execvp");
    		exit(1);
    #endif
    
    #if 0
    // ++++++++++++++++++++ execle ++++++++++++++++++++
    /*
     *	 int execle(const char *path, const char *arg, ..., char *const envp[]);
     *	 	从用户指定的目录中搜索指定的命令
     */
    		printf("this is func +++++++++ execle +++++++++
    ");
    		char* env[] = {"/bin", "./", "/home/robin", NULL};	// 自己指定环境变量,对应PATH
    		execle("/bin/ls", "ls", "-l", "-a", NULL, env);
    		// 如果执行成功没有返回值
    		perror("execle");
    		exit(1);
    #endif
    
    #if 0
    // ++++++++++++++++++++ execv ++++++++++++++++++++
    /*
     *  int execv(const char *path, char *const argv[]);
     *  	用法同:execl
     */
    		printf("this is func +++++++++ execve +++++++++
    ");
    		char* argv[] = {"a.out", NULL};
    		execv("/home/robin/a.out", argv);
    		// 如果执行成功没有返回值
    		perror("execv");
    		exit(1);
    #endif
    
    #if 1
    // ++++++++++++++++++++ execve ++++++++++++++++++++
    /*
     *  int execve(const char *path, char *const argv[], char *const envp[]);
     */
    		printf("this is func +++++++++ execve +++++++++
    ");
    		char* argv[] = {"ps", "a", "u", "x", NULL};
    		char* env[] = {"/bin", "/home/", "./", NULL};
    		execve("/bin/ps", argv, env);
    		// 如果执行成功没有返回值
    		perror("execve");
    		exit(1);
    #endif
    	}
    
    	else if(pid > 0)
    		printf("parent process +++++++++++++++++++
    ");
    	printf("*****************************
    ");
    
    	return 0;
    }
    
  • 相关阅读:
    AtCoder Grand Contest 033
    Luogu P6620 [省选联考 2020 A 卷] 组合数问题
    Luogu P6631 [ZJOI2020] 序列
    Luogu P6630 [ZJOI2020] 传统艺能
    Luogu P6633 [ZJOI2020] 抽卡
    Luogu P6623 [省选联考 2020 A 卷] 树
    AtCoder Grand Contest 034
    Luogu P5445 [APIO2019] 路灯
    LOJ #6059. 「2017 山东一轮集训 Day1」Sum
    Luogu P3721 [AH2017/HNOI2017]单旋
  • 原文地址:https://www.cnblogs.com/hesper/p/10738826.html
Copyright © 2011-2022 走看看