zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linux 进程学习(四) sigaction 函数
    Netty 编解码奥秘
    我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:护国小将,邀请大家一同入驻:https://www.oschina.net/sharingplan/apply
    Netty数据如何在 pipeline 中流动
    PLM系统安装四:主卷服务安装(FSC缓存服务器plm4IP:42.20)
    Linux系统信息和进程相关命令(CPU,内存,进程)
    SAN交换机配置的备份还原,固件升级
    san交换机的级联
    PLM系统安装五(2):Corporate服务安装plm1IP:42.106
    第三步:服务器虚拟化XenServer实施部署文档
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11311784.html
Copyright © 2011-2022 走看看