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\n");
    }
    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\n");
    }
    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\n");
    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\n");
    }
    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\n");
    }
    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

 

posted @   王清河  阅读(270)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2018-08-06 1014 Waiting in Line (30)
2018-08-06 1057 Stack (30)
点击右上角即可分享
微信分享提示