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

  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11311784.html
Copyright © 2011-2022 走看看