• linux-进程-execl族函数


    exec函数的作用:

            我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。

    简单来说就是,子程序可以在不影响父程序下,执行别的程序

    功能:

            在调用进程内部执行一个可执行文件。可执行文件既可以是一个二进制文件,也可以是任何linux下可执行的脚本文件。

    函数族:

            分别是:execl,execlp,execle,execv,execvp,execvpe
    函数原型:

    1. #include //exec函数族的头文件
    2. int execl(const char *path, const char *arg, ...);
    3. int execlp(const char *file, const char *arg, ...);
    4. int execle(const char *path, const char *arg, ...,char *const envp[]);
    5. int execv(const char *path, char *const argv[]);
    6. int execvp(const char *file, char *const argv[]);
    1. 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回;
    2. 如果调用出错则返回-1;
    3. 所以exec函数只有出错的返回值而没有成功的返回值

    快速分辨不同函数方法:

    l(list) :        表示参数采用列表;
    v(vector) : 参数用数组;
    p(path) :    有p自动搜索环境变量PATH;
    e(env) :     表示自己维护环境变量;(深入使用Linux再学习)

    1.execl使用:

    代码:

    实现子进程ls功能;键入whereis ls 查找ls位置,如图:

    代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. pid_t pid = fork();
    9. if(pid == 0){
    10. //child process
    11. printf("child pid:%d\n",getpid());
    12. execl("/bin/ls","ls","-a","-l",NULL);
    13. // printf("child pid:%d",getpid());
    14. //exit child process
    15. exit(0);
    16. }
    17. //father process
    18. wait(NULL);
    19. printf("i am father[%d] ,do my thing ,不会被子进程的[%d]execl函数影响\n",getpid(),pid);
    20. return 0;
    21. }

    结果:

    execl具体解释:这里引用呋喃吖_Leetcode,c++,Linux-CSDN博客

    推荐看她的,写的很清楚

    这里介绍一下perror函数

    1、作用:
    打印系统错误信息

    2、原型

    #include
    void perror(const char *s);
    #include

    3、代码:

    #include
    #include
    #include
    #include
    #include
    #include

    int main()
    {
            int fd;
            fd=open("./file", O_RDWR);//打开文件file,读写方式
            if(fd < 0){
                printf("open failure\n");
                perror("why");//打印失败的原因
            }
            close(fd);
            return 0;
    }

     

    运行结果:
    //我的目录下是没有文件file的

    open failure
    why: No such file or directory
     

    linux下data与ps指令同理

    2.execlp函数

    execlp和execl的区别在于,execlp在第一个参数时候,不需要全路径,只需要写上执行命令的文件名即可,表示你需要执行谁,往后的参数也就是和execl的传参一样。

    p为环境变量:使用时需要调用环境变量,方法如下:

    pwd:查看当前路径

    echo $PATH:显示当前PATH环境变量,该变量的值由一系列以冒号分隔的目录名组成。
    export PATH=$PATH:路径名:环境变量的配置

    代码:这里引用上述作者的:

    1. #include
    2. #include//使用fork,exec函数
    3. #include//使用waitpid
    4. #include //使用exit的头文件
    5. int main()
    6. {
    7. if(fork() == 0){
    8. // execl("/usr/bin/ls","ls","-a","-l",NULL);
    9. execlp("ls","ls","-a","-l",NULL); //等价上面的execl()
    10. //虽然这里的第一个参数和第二个参数都一样,但是含义不一样;
    11. //第一个参数表示iexeclp函数要执行命令的路径文件名,
    12. //第二个参数表示execlp在命令行上如何执行该命令
    13. exit(1);
    14. }
    15. int waitRet = waitpid(-1,NULL,0); //阻塞等待所有子进程结束
    16. if(waitRet< 0){
    17. perror("wait error\n");
    18. }
    19. printf("parent wait child success\n");
    20. return 0;
    21. }

    结果:

    3.execv函数

    与execl函数没啥区别,就是传参的时候使用数组,而不是列出来

    代码如下:

    1. #include
    2. #include
    3. #include
    4. //函数原型:int execl(const char *path, const char *arg, ...);
    5.  
    6. int main(void)
    7. {
    8.     printf("this is system date\n");
    9.  
    10.     char *argv[]={"ps",NULL,NULL};//数组形式
    11.     if(execv("/bin/ps",argv) == -1)
    12.     {
    13.         printf("execl failed!\n");      
    14.     perror("why");
    15.     }
    16.     printf("after execl\n");
    17.     return 0;
    18. }

    4.execvp可以类比execlp

  • 相关阅读:
    IDEA debug调试基础
    真正的Mac电脑必备装机应用CleanMyMac X
    智能文件改名:高效复制并删除冗余,简化文件管理“
    centos docker服务问题
    css案例15——复选框样式修改(复选框变为圆角)
    【前端知识】Three 学习日志(十)—— 常见几何体(长方体、球体、圆柱、矩形平面、圆形平面)
    Python教程——多线程
    RT-Thread 内存管理(学习二)
    机器学习简述
    感恩节跟进技巧(附邮件模板)
  • 原文地址:https://blog.csdn.net/Herry_z/article/details/132747140