• exec族函数


    fork()函数生成的子进程只能运行与父进程相同的代码函数,如果想要子进程执行另外一个程序,需要用到exec族的函数,如下:

    execlp()函数

    int execlp(const char *file,const char *arg,…);
    /***
    execlp.c
    ***/
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    
    int main()
    {
        pid_t pid;
        pid = fork();
        if(-1 == pid)
        {
            perror("fork error:");
            exit(1);
        }
        else if(0 < pid)
        {
            sleep(2);
            printf("parent
    ");
        }
        else
        {
            execlp("ls","ls","-l","-a",NULL);
        }
        return 0;
    }

    运行结果:

    ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./execlp

    总用量 28

    drwxrwxr-x 2 ubuntu1604 ubuntu1604 4096 8月   6 13:19 .

    drwxrwxr-x 3 ubuntu1604 ubuntu1604 4096 8月   6 13:06 ..

    -rwxrwxr-x 1 ubuntu1604 ubuntu1604 8856 8月   6 13:19 execlp

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604  274 8月   6 13:19 execlp.c

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604   37 8月   6 13:10 test.c

    parent

    execl()函数

    execl()函数第一个参数跟的是程序路径地址

    int execl(const char *path,const char*arg,…);
    /***
    execl.c
    ***/
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    
    int main()
    {
        pid_t pid;
        pid = fork();
        if(-1 == pid)
        {
            perror("fork error:");
            exit(1);
        }
        else if(0 < pid)
        {
            sleep(2);
            printf("parent
    ");
        }
        else
        {
            execlp("/bin/ls","ls","-l","-a",NULL);
        }
        return 0;
    }

    运行结果:

    ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ gcc execl.c -o execl

    ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./execl

    总用量 44

    drwxrwxr-x 2 ubuntu1604 ubuntu1604 4096 8月   6 13:23 .

    drwxrwxr-x 3 ubuntu1604 ubuntu1604 4096 8月   6 13:06 ..

    -rwxrwxr-x 1 ubuntu1604 ubuntu1604 8856 8月   6 13:23 execl

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604  280 8月   6 13:23 execl.c

    -rwxrwxr-x 1 ubuntu1604 ubuntu1604 8856 8月   6 13:19 execlp

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604  275 8月   6 13:21 execlp.c

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604   37 8月   6 13:10 test.c

    parent

    该函数可以执行自定义函数:

    /*** *
    test.c
    **/
    #include<stdio.h>
    #include<unistd.h>
    
    int main()
    {
        printf("This is a test
    ");
        sleep(1);
        return 0;    
    }
    
    /***
    execl.c
    ***/
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    
    int main()
    {
        pid_t pid;
        pid = fork();
        if(-1 == pid)
        {
            perror("fork error:");
            exit(1);
        }
        else if(0 < pid)
        {
            sleep(2);
            printf("parent
    ");
        }
        else
        {
            execlp("./test","test",NULL);
        }
        return 0;
    }

    运行结果:

    ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./execl

    This is a test

    parent

    execv()函数

    int execv(const char * file,char *const argv[]);
    /***
    execv.c
    ***/
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    
    int main()
    {
        pid_t pid;
        pid = fork();
        if(-1 == pid)
        {
            perror("fork error:");
            exit(1);
        }
        else if(0 < pid)
        {
            sleep(2);
            printf("parent
    ");
        }
        else
        {
            char *argv[] = {"ls","-l","-a","-h",NULL};
            execv("/bin/ls",argv);
        }
        return 0;
    }

    运行结果:

    ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ gcc execv.c -o execv

    ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./execv

    总用量 76K

    drwxrwxr-x 2 ubuntu1604 ubuntu1604 4.0K 8月   6 13:43 .

    drwxrwxr-x 3 ubuntu1604 ubuntu1604 4.0K 8月   6 13:06 ..

    -rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.7K 8月   6 13:34 execl

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604  271 8月   6 13:34 execl.c

    -rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.7K 8月   6 13:19 execlp

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604  275 8月   6 13:21 execlp.c

    -rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.8K 8月   6 13:43 execv

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604  343 8月   6 13:42 execv.c

    -rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.5K 8月   6 13:32 test

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604  106 8月   6 13:34 test.c

    -rw-rw-r-- 1 ubuntu1604 ubuntu1604   55 8月   6 13:28 while.c

    parent

  • 相关阅读:
    如何弹出QQ临时对话框实现不添加好友在线交谈效果
    让sublime text3支持Vue语法高亮显示[转]
    spa(单页面应用)的优缺点[转]
    vue-devtoools 调试工具安装
    元素视差方向移动jQuery插件-类似github 404页面效果
    js删除数组元素、清空数组的简单方法
    sublime text3 setting-user
    vue环境搭建
    Starting httpd:Could not reliably determine the server's fully qualified domain name
    使用传输表空间迁移数据
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11311784.html
Copyright © 2020-2023  润新知