Linux多进程编程之exec函数族使用

news/2024/11/17 6:19:40/

Linux多进程编程之exec函数族使用

  • 1.exec函数族是什么
  • 2.execl函数具体使用
  • 3.execlp
  • 4.exec后面不同字母所代表的含义

1.exec函数族是什么

顾名思义,它并不只是一个函数,而是以exec开头的六个函数,并且是没有exec这个函数的(就像TCP/IP协议族不只是TCP和IP两个协议一样):

       int execl(const char *path, const char *arg, .../* (char  *) NULL */);int execlp(const char *file, const char *arg, .../* (char  *) NULL */);int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */);int execv(const char *path, char *const argv[]);int execvp(const char *file, char *const argv[]);int execvpe(const char *file, char *const argv[],char *const envp[]);

它们的作用就是在使用fork产生多进程之后,可以将子进程的进程空间替换成我们想要执行的程序,产生一个金蝉脱壳的效果。因为很多时候我们并不想让子进程一样的执行父进程的代码,因为子进程复制了父进程的进程空间,一样的代码和变量。而使用exec函数族则可以让子进程换成其它的可执行程序。
而在exec函数族当中,如上面的代码所示,最常用的起始就是前两个函数,execl和execlp。所以下面具体讲解前两个函数的具体用法,其它函数当然也会介绍如何使用。

2.execl函数具体使用

首先我们可以先生成一个可执行程序:

//hello.c
#include <stdio.h>int main() {printf("hello Ntt!\n");return 0;
}

然后可以在Linux下编译一下:

sudo gcc hello.c -o hello

关于execl的解读:

int execl(const char *path, const char *arg, .../* (char  *) NULL */);

第一个参数path代表的是可执行文件的路径,可以使用绝对路径或者相对路径,推荐使用绝对路径。后面的都是这个可执行文件的参数,以NULL作为结尾,这里注意,虽然我们hello程序没有其它的参数,但它本身就算参数的一部分,所以下面可见具体使用:

//excel.c
//CSDN Credic1017
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() {pid_t pid = fork();if(pid > 0) {printf("I am parent process. and pid=%d, ppid=%d\n", getpid(), getppid());sleep(1);}else if(pid == 0) {execl("hello", "hello", NULL);//下面的代码不会执行printf("I am child process. and pid=%d, ppid=%d\n", getpid(), getppid());}return 0;
}

编译一下:

sudo gcc excel.c -o excel

并且在return 0前面再放个打印语句,子进程也不会执行该打印语句,因为它的进程空间全部被替换了,替换成了我们的hello可执行程序。
这里的话还可以调用Linux本身的程序,比如查看系统进程状态 ps aux,那么这里同理,ps所在的位置可用which查看,ps作为第一个参数,aux作为第二个参数,都是以字符数组存在的参数,最后以NULL结尾。

//excel.c
//CSDN Credic1017
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() {pid_t pid = fork();if(pid > 0) {printf("I am parent process. and pid=%d, ppid=%d\n", getpid(), getppid());sleep(1);}else if(pid == 0) {execl("/bin/ps", "ps", "aux", NULL);//下面的代码不会执行printf("I am child process. and pid=%d, ppid=%d\n", getpid(), getppid());}return 0;
}

3.execlp

int execlp(const char *file, const char *arg, .../* (char  *) NULL */);

这里只讲和execl的区别,第一个参数由path改为了file,file直接就为需要执行的可执行文件的文件名,就比如hello,像之前的path,就是要选定文件的相对路径或者绝对路径。当然ps也是直接写的,而不是像之前的/bin/ps。后面的参数还是一样的。

execlp("ps", "ps", "aux", NULL);

它也会和之前的运行结果一样,主要是他会到环境变量中去找。如果环境变量没找到则返回失败的参数。

4.exec后面不同字母所代表的含义

在这里插入图片描述
前面在execl中已经使用了l,其实就是代表参数地址以空指针结尾,使用了参数地址列表。
p的话也介绍了,其实就是在可执行程序那块会自动调用环境变量,从而可以少写点路径名。
那再看到exec后面带v的一个用法:

//声明:
int execv(const char *path, char *const argv[]);//使用:
char *argv = {"ps", "aux", NULL};
execv("/bin/ps", argv);

那再看到exec后面带e的一个用法:
对于e结尾的解读就是存有环境变量字符串地址的指针数组的地址。

#include <unistd.h>
int execve(const char *filename, char *const argv[],char *const envp[]);//使用:
char *const envp[] = {"/home/NTT", "/home/aaa", "/home/bbb"};
char *argv = {"ps", "aux", NULL};
execve("/bin/ps", argv, envp);

所以,结合exec后面每种字母代表的含义能正确的使用exec函数族,遇事不决找男人(man)。


http://www.ppmy.cn/news/8433.html

相关文章

C++中STL的vector扩容机制

目录前言发生扩容扩容机制size()和capacity()reserve()和resize()前言 前阵子面试的时候&#xff0c;被问到往vector中插入一个数据可能会发生什么&#xff1f; 我答:可能会扩容; 为啥vector支持变长&#xff1f; 我答:它实在堆上动态申请内存&#xff0c;因此有自己的一套扩容…

保护性暂停设计模式

目录 保护性暂停设计模式 获取结果 产生结果 总代码实现 测试 增加超时效果的Guarded suspension get(long timeout) 测试 保护性暂停设计模式 Guarded Suspension 即 保护性暂停; 是一种等待唤醒机制的一种规范 ,也可以理解为使用中设计模式,Java的API很多都按照保护性…

android中service实现原理分析

前言&#xff1a; 一开始的目标是解决各种各样的ANR问题的&#xff0c;我们知道&#xff0c;ANR总体上分有四种类型&#xff0c;这四种类型有三种是和四大组件相对应的&#xff0c;所以&#xff0c;如果想了解ANR发生的根因&#xff0c;对安卓四大组件的实现流程是必须要了解的…

第一个完整的CMake工程

第一个完整的CMake工程一、概述二、准备工作2.1 创建工程2.2 创建源码目录三、换个地方保存目标二进制文件3.1 add_subdirectory 指令说明3.2 重设目标二进制生成目录四、如何安装4.1 目标文件的安装4.2 普通文件的安装4.3 非目标文件的可执行程序安装(比如脚本之类)&#xff1…

【自学Java】Java选择结构if

Java选择结构if Java语言if条件判断 在 Java 中&#xff0c;关键字 if 是用于测试某个条件&#xff08;布尔型或逻辑型&#xff09;的语句是否满足一定的条件&#xff0c;如果满足特定的条件&#xff0c;则会执行 if 后面的大括号 {} 括起来的代码块&#xff0c;如果没有代码…

领导的本质就是:管理自己,影响别人

欲戴皇冠&#xff0c;必承其重。作为领导者&#xff0c;就应当承担相应的职责。管理好自己&#xff0c;下面还有很多双眼睛看着你&#xff0c;正人先正己&#xff0c;身正令才行&#xff0c;自己做好了&#xff0c;才可能影响到别人&#xff0c;成为一位受人尊重的领导者。 有…

一名普通Java程序员的2022的总结和2023的展望

前言今天是元旦节&#xff0c;也是2023年的第一天&#xff0c;首先祝各位亲朋好友们元旦快乐&#xff0c;在新的一年全家身体康健&#xff0c;诸事顺遂&#xff0c;阖家幸福&#xff0c;最重要的是身体健康&#xff0c;工作顺利&#xff0c;永无BUG永不加班&#xff01;&#x…

Eth08-EthCtrlConfig:以太网控制器的硬件操作的timeout值配置

文章目录 1 EthCtrlConfig:以太网控制器的硬件操作的timeout值配置传送门 ==>> AutoSAR入门和实战系列总目录 1 EthCtrlConfig:以太网控制器的硬件操作的timeout值配置 /MICROSAR/Eth_Enet/Eth/EthConfigSet/EthCtrlConfig: Configuration of the individual control…