linux-进程的替换exec函数族

2021/4/25 7:28:59

本文主要是介绍linux-进程的替换exec函数族,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 一、进程的替换
  • 二、exec函数族
    • execl函数
    • execlp函数
    • execvp函数


一、进程的替换

exec族函数函数的作用:
我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。
exec函数族,是由六个exec函数组成的。
1、exec函数族提供了六种在进程中启动另一个程序的方法。
2、exec函数族可以根据指定的文件名或目录名找到可执行文件。
3、调用exec函数的进程并不创建新的进程,故调用exec前后,进程的进程号并不会改变,其执行的程序完全由新的程序替换,而新程序则从其main函数开始执行。
exec函数族取代调用进程的数据段、代码段和堆栈段
在这里插入图片描述

一个进程调用exec后,除了进程ID,进程还保留了下列特征不变:
父进程号 
进程组号 
控制终端 
根目录 
当前工作目录 
进程信号屏蔽集 
未处理信号

二、exec函数族

在这里插入图片描述
e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量。

execl函数

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//函数原型:int execl(const char *path, const char *arg, ...);

int main(void)
{
    printf("before execl\n");
    //if(execl("./echoarg","echoarg","abc",NULL) == -1)                  ./为当前目录
    //if(execl("/bin/ls","ls",NULL,NULL) == -1)
    if(execl("/bin/ls","ls","-l",NULL) == -1)
    {
        printf("execl failed!\n");    
        perror("why");                                                 //打印出打开失败的原因
    }
    printf("after execl\n");
    return 0;
}

execlp函数

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//int execlp(const char *file, const char *arg, ...); 自己查找不用写路径即便当前路径下没有他也会取其他路径下查找
int main(void)
{
    printf("this pro get system date\n");
    if(execlp("ps","ps",NULL,NULL) == -1)
    {
        printf("execl failed!\n");    
        perror("why");                                                 //打印出打开失败的原因
    }
    printf("after execl\n");
    return 0;
}

execvp函数

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//v:如果是带v的函数,对应的命令或者程序是通过一个指针数组来传递的,指针数组的最后一个元素为NULL标识结束
int main(void)
{
    printf("this pro get system date\n");
    char *argv[]={"ps","-l",NULL};
    if(execvp("ps",argv) == -1)
    {
        printf("execl failed!\n");    
        perror("why");                                                 //打印出打开失败的原因
    }
    printf("after execl\n");
    return 0;
}

在这里插入图片描述



这篇关于linux-进程的替换exec函数族的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程