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;
    }
    
  • 相关阅读:
    257. Binary Tree Paths
    324. Wiggle Sort II
    315. Count of Smaller Numbers After Self
    350. Intersection of Two Arrays II
    295. Find Median from Data Stream
    289. Game of Life
    287. Find the Duplicate Number
    279. Perfect Squares
    384. Shuffle an Array
    E
  • 原文地址:https://www.cnblogs.com/hesper/p/10738826.html
Copyright © 2011-2022 走看看