Linux手账—exec和fork

embedded/2024/10/18 11:59:00/

希望你开心,希望你健康,希望你幸福,希望你点赞!

最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要!


前言

在操作系统中,进程控制和程序执行是核心功能。fork 和 exec 系列函数为此提供了强大的工具。fork 用于创建一个新进程(子进程),而 exec 系列函数则用于在当前进程中执行新程序,替换其代码段。本文旨在简要介绍这两个函数的基本概念、用途和工作原理。


evec

包含的头文件

#include <unistd.h>:这个头文件包含了POSIX操作系统API的函数原型,如文件操作、进程控制、目录操作等。在这里,它主要是为了使用exec系列的函数。


外部变量

extern char **environ;:这行代码声明了一个外部变量environ,它是一个指向字符指针数组的指针。这个数组包含了当前进程的环境变量,每个元素都是一个指向以null结尾的字符串的指针。这个数组以NULL结尾。


函数原型

代码中列出了多个exec系列的函数原型,但有一些拼写错误和格式问题。正确的函数名和参数应该如下:注意:

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

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

int execle(const char *path, const char *arg, ..., 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[]);

int execve(const char *filename, char *const argv[], char *const envp[]);

exel应为execl

exele应为execle,且参数列表中的逗号使用有误,应去掉多余的逗号。

execvexecvp的函数原型在图片中基本正确,但execvp的参数列表中的逗号位置不影响其意义,只是格式上的小瑕疵。

execvpeexecve的函数原型在图片中同样存在格式上的问题,主要是多余的逗号,但核心意思正确。


NULL指针

代码中提到了NULL,但在给出的文本中,NULL被误写为NOLL。在C语言中,NULL用于表示空指针。


函数功能

这些exec系列的函数都用于在当前进程中执行一个新的程序。它们会替换当前进程的地址空间(代码、数据、堆栈等)为新程序的地址空间。

不同的exec函数提供了不同的方式来指定要执行的程序、传递命令行参数以及设置环境变量。


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

execl函数使用给定的路径名path来执行一个程序。

第二个参数arg是传递给新程序的第一个命令行参数(通常是程序的名称)。

后续参数是可变数量的命令行参数,列表必须以NULL结尾。

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

execlp函数类似于execl,但它使用PATH环境变量来查找要执行的程序。

file参数是程序名,而不是路径名。

其余参数与execl相同。

int execle(const char *path, const char *arg, ..., char *const envp[]);

execle函数与execl类似,但它允许用户指定一个新的环境变量数组envp

envp是一个以NULL结尾的字符指针数组,每个元素都是一个指向环境变量的指针。

其余参数与execl相同。

int execv(const char *path, char *const argv[]);

execv函数使用给定的路径名path来执行一个程序。

argv是一个指向以NULL结尾的字符指针数组的指针,该数组包含要传递给新程序的命令行参数。

argv[0]通常是程序的名称。

int execvp(const char *file, char *const argv[]);

execvp函数类似于execv,但它使用PATH环境变量来查找要执行的程序。

file参数是程序名,而不是路径名。

argv参数与execv相同。

int execvpe(const char *file, char *const argv[], char *const envp[]);

execvpe函数结合了execvpexecle的特点。

它使用PATH环境变量来查找要执行的程序,并允许用户指定一个新的环境变量数组envp

fileargv参数与execvp相同,envp参数与execle相同。

int execve(const char *filename, char *const argv[], char *const envp[]);

execve函数是最通用和最强大的exec函数。

它允许用户直接指定要执行的文件的名称filename、命令行参数数组argv和环境变量数组envp

filename可以是绝对路径或相对路径。


fork

fork是Linux系统中的一个非常重要的系统调用,它用于创建一个新的进程。以下是关于fork命令的详细分析:

一、fork的基本功能

fork函数通过系统调用创建一个与原来进程几乎完全相同的进程,新创建的进程被称为子进程,而原进程被称为父进程。子进程会继承父进程的资源,包括代码、数据、堆栈、文件描述符、内存映射、信号处理等,但每个进程都会拥有自己独立的地址空间和堆栈。

二、fork的返回值

  • 在父进程中,fork函数返回新创建的子进程的进程ID(PID)。
  • 在子进程中,fork函数返回0。
  • 如果创建进程失败,fork函数返回-1,并设置相应的errno值以指示错误类型。

三、fork的执行流程

  1. 当调用fork函数时,操作系统会为新的子进程分配资源,包括存储数据和代码的空间。
  2. 操作系统会把父进程的所有值都复制到新的子进程中,但某些值(如进程ID、父进程ID、返回地址等)在子进程中会被设置为新的值。
  3. fork函数会返回两次:一次在父进程中返回子进程的PID,一次在子进程中返回0。因此,在调用fork函数后,需要判断返回值以确定当前是在父进程还是子进程中。

四、fork后的进程状态

  1. 父进程和子进程是并发执行的,它们的执行顺序是不确定的,这取决于操作系统的进程调度策略。
  2. 父进程和子进程之间的内存空间是独立的,它们不能直接共享变量和数据。如果需要在父子进程之间共享数据,可以使用共享内存、管道、消息队列等进程间通信(IPC)机制。
  3. 子进程会继承父进程的文件锁、信号处理器等状态,但也可以独立地修改这些状态。

总结

简而言之,fork 函数用于创建一个新进程,该进程是调用进程的副本(子进程)。子进程会继承父进程的资源,但拥有独立的地址空间和堆栈。而 exec 系列函数则用于在当前进程中执行新程序,替换其地址空间。这些函数为开发者提供了进程控制和程序执行的灵活性。通过 fork 和 exec,开发者可以实现多进程编程,提高程序的并发性和响应速度。同时,需要注意这些函数的返回值和执行流程,以及进程间的独立性和通信机制。


希望你开心,希望你健康,希望你幸福,希望你点赞!

最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要!


http://www.ppmy.cn/embedded/128442.html

相关文章

GitHub生成SSH密钥,

GitHub会通过SSH密钥来验证你的身份&#xff0c;确保你有权限克隆、推送或拉取代码。 对于公开仓库&#xff0c;你不需要额外的权限&#xff0c;只需确保SSH密钥已正确配置并可以通过GitHub验证。公开仓库允许任何人克隆&#xff0c;即使仓库属于他人&#xff0c;只要你通过SS…

K-means 算法、层次聚类、密度聚类对鸢尾花(Iris)数据进行聚类

目录 1.基础知识 1.1 K-Means 算法 1.2 层次聚类&#xff08;Hierarchical Clustering&#xff09; 1.3 密度聚类&#xff08;DBSCAN&#xff09; 1.4 距离和相似度度量方法 1.5 总结&#xff1a; 2.K-means 算法对鸢尾花&#xff08;Iris&#xff09;数据进行聚类 2.1…

外包功能测试干了6个月,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;23年通过校招进入武汉某软件公司&#xff0c;干了差不多6个月的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我就在一个外包企业干了6个月的功…

快速上手机器学习-感知机

感知机 引言&#xff1a;本文通过介绍超平面引入感知机模型的基本思路&#xff0c;同时介绍了包括线性回归&#xff0c;三种梯度下降算法等相关算法&#xff0c;在文末对感知机模型的原始形式进行了代码实现&#xff0c;希望通过朴素的语言帮助刚开始学习机器学习和统计学习方法…

Axure重要元件三——中继器函数

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;中继器函数 主要内容&#xff1a;Item、Reperter、TargetItem 1、中继器的函数&#xff1a;Item\Reperter\TargetItem Item item&#xff1a;获取…

【PHP】thinkphp处理订单支付回调的时候,加锁和回滚

在处理订单支付回调时&#xff0c;为了确保并发安全&#xff0c;通常需要使用数据库锁来防止同一订单被重复处理&#xff0c;同时在出现错误时可以进行回滚操作。以下是在 ThinkPHP 框架中加锁和回滚的一般步骤&#xff1a; 1. 开启事务&#xff08;事务用于确保操作的原子性&…

NginxProxyManager申请SSL证书

NginxProxyManager版本号 选择NginxProxyManager版本号很重要,能够登录和ssl证书申请问题 》NginxProxyManager v2.12.1 登录会出bad gateway问题 》NginxProxyManager v2.10.4不会出现bad gateway,但是不追加升级依赖项,申请ssl证书会出下面的问题 The certbot_dns_clo…

Flink移除器Evictor

前言 在 Flink 窗口计算模型中&#xff0c;数据被 WindowAssigner 划分到对应的窗口后&#xff0c;再经过触发器 Trigger 判断窗口是否要 fire 计算&#xff0c;如果窗口要计算&#xff0c;会把数据丢给移除器 Evictor&#xff0c;Evictor 可以先移除部分元素再交给 ProcessFu…