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

  • 相关阅读:
    洛谷P2292 [HNOI2004]L语言
    洛谷P4052 [JSOI2007]文本生成器(AC自动机)
    洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)
    创建目录命令
    ssh免密码登录机器(使用公钥和秘钥进行加密来实现)
    kafka工作原理介绍
    KafKa集群安装、配置
    Kafka的partions和replication-factor参数的理解
    linux之find命令详解
    将用户需求和新型技术输入,优质服务和价值体验输出。
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11311784.html
Copyright © 2011-2022 走看看