学习记录第二十四天

news2025/2/22 16:41:07

exec函数族
exec函数族是一系列在Linux系统中用于替换当前进程映像的系统调用。这些函数允许一个进程加载并执行一个新的程序,同时保留当前进程的进程ID和其他属性。exec函数族的成员包括多种函数,它们在语法和功能上有所不同,以适应不同的使用场景。
exec函数族的成员及其功能细节

  int exec l(const char *path, const char *arg, ...);
  int exec l p(const char *file, const char *arg, ...);
  int exec l e(const char *path, const char *arg,..., char * const envp[]);
  int exec v(const char *path, char *const argv[]);
  int exec v p(const char *file, char *const argv[]);
  int exec v pe(const char *file, char *const argv[], char *const envp[]);


  1.execl:执行指定路径的程序,并通过一系列可变参数传递给新程序。这个函数的参数列表以NULL结尾,第一个参数通常是要执行的程序的路径,第二个参数是传递给新程序的第一个参数(通常是程序的名称),其余参数是传递给新程序的额外参数。
  2.execlp:类似于execl,但会在PATH环境变量指定的目录中搜索可执行文件。如果找到同名的可执行文件,execlp会执行该文件,而不是指定的完整路径。
  3.execle:执行指定路径的程序,并通过一系列可变参数传递给新程序,同时允许设置新的环境变量。execle的参数列表同样以NULL结尾,并且可以通过传递一个环境变量数组来设置新的环境变量。
  4.execv:执行指定路径的程序,并通过一个以NULL结尾的字符串指针数组传递参数。execv的第一个参数是要执行的程序的路径,第二个参数是传递给新程序的参数数组。
  5.execvp:执行指定文件名的程序,并通过一个以NULL结尾的字符串指针数组传递参数,同时在PATH环境变量中指定的目录中搜索可执行文件。execvp的第一个参数是要执行的程序的文件名,第二个参数是传递给新程序的参数数组。
  6.execve:执行指定路径的程序,并通过一个以NULL结尾的字符串指针数组传递参数,同时允许设置新的环境变量。execve的第一个参数是要执行的程序的路径,第二个参数是传递给新程序的参数数组,第三个参数是新的环境变量数组。

exec函数的特点和使用场景
  1.exec函数在成功执行后不会返回,因为它替换了当前进程的映像。如果exec调用失败,它会返回-1,并设置errno以指示错误原因。
  2.exec函数通常与fork函数结合使用,以便在子进程中执行新程序,而父进程可以继续执行其他任务或等待子进程结束。这种组合允许父进程在子进程执行新程序之前进行必要的清理工作或设置。
  3.exec函数族的成员之间的主要区别在于它们接受参数的方式不同:execl和execle使用可变参数列表,execv和execve使用字符串指针数组,而execvp和execle可以在PATH环境变量中搜索可执行文件。

exec函数的典型使用示例
以下是使用execvp函数的示例,它在PATH环境变量中指定的目录中搜索ls命令并执行它:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    char *args[] = {"ls", "-l", NULL};
    if (execvp("ls", args) == -1) {
        perror("execvp failed");
    }
    // 如果execvp成功,以下代码不会被执行
    printf("This line will not be printed if execvp succeeds.");
    return 0;
}

在这个示例中,如果execvp调用成功,当前进程的映像将被ls程序替换,并且printf函数不会被执行。如果execvp失败,则会打印错误信息并继续执行剩余的代码。

注意事项
  1.在使用exec函数之前,应该确保当前进程有适当的权限来执行新程序。
  2.exec函数不会创建新的进程,而是替换当前进程的地址空间。
  3.在调用exec函数后,通常需要检查返回值以确定调用是否成功。
  4.exec函数族中的某些函数(如execle和execvp)会在PATH环境变量中搜索可执行文件,这可能会导致安全问题,因此在使用这些函数时需要谨慎。

进程终止的概念
进程终止是指一个进程完成其执行或由于某种原因提前结束其运行的状态。进程终止后,其资源会被操作系统回收,进程控制块(PCB)可能会被销毁或转变为僵尸状态,直到其父进程读取其退出状态并释放相关资源。

exit函数的作用和重要性
exit函数是C语言中用于请求终止当前进程的标准库函数。当exit函数被调用时,它会执行以下操作:
  1.清除程序的全局变量。
  2.关闭所有打开的文件描述符。
  3.调用所有注册的清理处理函数(使用atexit或at_exit函数注册)。
  4.向父进程发送一个SIGCHLD信号。
  5.终止进程,并将控制权返还给操作系统。
exit函数的返回值(status参数)可以被父进程通过wait或waitpid系统调用来获取,用于了解子进程的退出状态。通常,exit(0)表示正常退出,而非零值表示异常退出。
exit函数的使用方法和参数含义

exit函数的原型如下:

#include <stdlib.h>

void exit(int status);

  1.status参数是一个整数,用于指定进程的退出状态。这个状态值可以包含特定的错误码或其他信息,以便父进程能够理解子进程的退出原因。

exit函数与_exit函数的区别
exit函数和_exit函数都用于终止进程,但它们在行为上有所不同:
  1.exit函数在终止进程之前会执行更多的清理工作,如关闭文件描述符和调用清理处理函数。
  2._exit函数则直接终止进程,不执行任何附加的清理操作。这意味着如果有未刷新的输出缓冲区,使用_exit函数可能会导致这些数据丢失。


exit函数的典型使用场景和代码示例
exit函数通常在以下场景中使用:
  1.在主函数main中作为返回语句,以正常结束程序。
  2.在程序的任何其他部分,当需要立即终止程序时,可以调用exit函数。
以下是一个使用exit函数的简单示例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("程序开始执行...\n");
    
    // 模拟某些条件下的异常退出
    if (some_error_condition()) {
        printf("检测到错误,退出程序...\n");
        exit(EXIT_FAILURE); // EXIT_FAILURE是一个宏,定义为1
    }
    
    printf("程序正常结束。\n");
    return 0;
}

在这个例子中,如果some_error_condition函数返回真(true),程序将打印一条错误消息并通过exit函数以异常状态退出。如果没有错误发生,程序将打印正常结束的消息并通过return语句退出。

注意事项和最佳实践
  1.在使用exit函数时,应当确保所有必要的清理工作已经完成,以避免资源泄露或其他潜在问题。
  2.如果程序中有未刷新的输出,应在调用exit之前显式刷新缓冲区或使用fflush函数。
  3.在多线程程序中,使用exit函数可能会导致未定义行为,因为它不是异步信号安全的。在这种情况下,应考虑使用其他同步机制来优雅地终止线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【QT】静态库与动态库

文章目录 开始之前一、静态库(static Library)定义使用场景特点程序示例 二、动态库(dynamic Library)定义使用场景特点。程序示例第二种调用 开始之前 测试环境&#xff1a;Qt 5.15.2 Based on Qt 6.4.3(MSVC 2019, x86_64) 操作系统&#xff1a;Windows11 专业版 编程语言&am…

vue打包更新packge.json版本号

VUE项目打包自动更新版本号 此方法只针对 Vue 如果使用其他框架&#xff0c;可以此参照作为参考 一、先看效果 二、创建 buildVersion.js 文件 文件内容 目前只针对3位版本号 递增规则是 每次更新 加一次小版本&#xff0c;10次小版本向前递增一个版本。如&#xff1a;1.0.9 递…

【自用】Python爬虫学习(一):爬虫基础与四个简单案例

Python爬虫学习&#xff08;一&#xff09; 基础知识四个简单的爬虫案列1.使用urlopen获取百度首页并保存2.获取某翻译单词翻译候选结果3.获取某网页中的书名与价格4.获取某瓣排名前250的电影名称 基础知识 对于一个网页&#xff0c;浏览器右键可以查看页面源代码&#xff0c;…

通过xshell使用密钥连接阿里云服务器

目录 步骤1&#xff1a;创建密钥对 步骤2&#xff1a;连接服务器 步骤3&#xff1a;连接服务器 连接阿里云服务器有几种方式&#xff0c;例如有密码进行连接&#xff0c;但是密码连接安全风险较大&#xff0c;所以我们选择密钥方式进行连接。操作简单且安全性高 步骤1&…

Element-plus中的el-input无法输入空格和Enter事件无法触发问题

摘要 因为在项目中经常遇到但是又经常忘记是什么原因&#xff0c;记录一下留着自用。 原因&#xff1a;在 el-input 外层包了一层 el-tooltip 导致的。 解决&#xff1a;设置 el-tooltip 的 trigger-keys 属性为空数组&#xff0c;<el-tooltip v-bind"$tooltipConfig&…

【测评】最好用的素材管理软件?3素材管理神器简单对比丨eagle、billfish、千鹿设计助手总有一款适合你

当电脑中的文件堆积如山&#xff0c;寻找特定素材变得耗时费力时&#xff0c;一款优秀的素材管理软件就显得尤为重要。本文将为您介绍三款备受推崇的素材管理工具&#xff1a;Eagle、Billfish和千鹿设计助手&#xff0c;它们各具特色&#xff0c;能有效提升您的工作效率。 今天…

26-原理图的PDF的输出

1. 2.输出完成后&#xff0c;查看

UDP协议与TCP协议的具体区别

在网络通信中&#xff0c;传输层协议扮演着至关重要的角色&#xff0c;它们负责将数据从发送端安全、高效地传输到接收端。UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;作为两种最基础的传输层协议&#xff0c;各自在不同的应用场景中…

力扣45:跳跃游戏2题解

题目链接&#xff1a; https://leetcode.cn/problems/jump-game-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 参考的代码随想录里面的题解&#xff1a; 题目 难度 中等&#xff0c;标的是中等难度&#xff0c;而且我之前做过这道题&#xff0c;但是我没写…

LoRA微调大语言模型Bert

LoRA是一种流行的微调大语言模型的手段&#xff0c;这是因为LoRA仅需在预训练模型需要微调的地方添加旁路矩阵。LoRA 的作者们还提供了一个易于使用的库 loralib&#xff0c;它极大地简化了使用 LoRA 微调模型的过程。这个库允许用户轻松地将 LoRA 层添加到现有的模型架构中&am…

springBoot整合xxl-job开箱即用

一、搭建xxl-job任务调用中心 1. 下载地址&#xff1a; xxl-job: 一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 git拉取后&#xff0c;本地打开&#xff0c;并进…

haproxy总结与实验

一、负载均衡 1.1 简述负载均衡 在高并发的业务场景下&#xff0c;解决单个节点压力过大&#xff0c;导致Web服务响应过慢&#xff0c;特别是严重的情况下导致服务瘫痪&#xff0c;无法正常提供服务的问题&#xff0c;而负载均衡的目的就是为了维护系统稳定可靠。负载均衡&…

汽车补光照明实验太阳光模拟器光源

汽车补光照明实验概览 汽车补光照明实验是汽车照明领域的一个重要环节&#xff0c;它涉及到汽车照明系统的性能测试和优化。实验的目的在于确保汽车在各种光照条件下都能提供良好的照明效果&#xff0c;以提高行车安全。实验内容通常包括但不限于灯光的亮度、色温、均匀性、响应…

奥运科技观察:AI PC,如何成为当代体育精神的数字捍卫者?

作者 | 曾响铃 文 | 响铃说 数字孪生帮助体育馆建设、超高清直播……这届奥运会科技感拉满&#xff0c;几乎所有前沿技术都能在奥运的赛事运营中发现。 而AI大时代&#xff0c;AI如何帮助帮助奥运会顺利举办、如何帮助运动员拥有更好的表现&#xff0c;同样值得业界关注&…

洛谷P3919 【模板】可持久化线段树 1(可持久化数组)

目录 tags中文题面思路代码 tags 线段树 主席树 中文题面 如题&#xff0c;你需要维护这样的一个长度为 N 的数组&#xff0c;支持如下几种操作 在某个历史版本上修改某一个位置上的值访问某个历史版本上的某一位置的值此外&#xff0c;每进行一次操作&#xff08;对于操作…

Mybatis PLUS代码生成器generate

Mybatis PLUS代码生成器generate 一、2.3版本二、生成代码三、3.5.1版本四、生成代码 一、2.3版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>2.3</version> </dep…

Java 随机生成密码包含大写字母、数字、特殊字符且指定长度

一、写在前面 现在网络环境越来越复杂&#xff0c;对密码安全要求也越来越严格&#xff0c;在生产环境种&#xff0c;对密码要求是一个不少于16位的随机密码&#xff0c;要求含有大写字母、小写字母、数字、特殊字符中的三种。我们使用java代码直接来可控的生成这种密码。 二…

数字县域+乡村振兴解决方案

1. 国家大数据战略与乡村振兴 国家大数据战略的核心内容包括加快建设数字中国&#xff0c;推动数据资源整合和开放共享&#xff0c;以大数据助力产业转型升级和社会治理创新&#xff0c;构建数字经济&#xff0c;提升国家治理现代化水平。 2. 乡村振兴战略的重大意义 乡村振…

【C++】特殊类设计 — 不能被拷贝的类 , 只能在堆/栈上创建对象的类 ,不能被继承的类

苟活者在淡红的血色中&#xff0c;会依稀看见微茫的希望&#xff1b; 真的猛士&#xff0c;将更奋然而前行。 --- 鲁迅 --- toc 1 特殊类 在实践中&#xff0c;常常会有一些比较有意思的特殊场景&#xff1a; 不能被拷贝的类 - 独一无二的魔法宝物&#xff1a; 在一个角色…

『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比!

『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比! 文章目录 一. 虚拟机(Virtual Machine,VM)与Docker对比!1. 定义这两种技术2. 工作原理3. 关于如何选择适合工作负载的技术的指导二. 参考文献Docker 只是一个轻量级的虚拟机吗?虽然二者确实有一个共同点,即 虚…