【并发程序设计】4. exec函数族

4.exec函数族

exec函数族是一组用于在进程中启动另一个程序来替换当前进程的函数

exec函数族主要用于在当前进程内部执行一个新的程序,而不会创建新的进程。

  • 子进程调用exec函数,族父进程不受影响。
  • 进程当前内容被指定的程序替换,但进程号不变

exec函数族中的一些主要成员:

  1. execl:这是exec函数族中最简单的一个,它接受一个可执行文件路径和一个参数列表,列表以NULL结尾。这个函数将新程序的参数一一对应地传递给新程序。
  2. execv:与execl类似,但是参数是通过一个指针数组传递的,而不是直接列出。
  3. execlpexecvp:这两个函数会搜索PATH环境变量来找到可执行文件,而不需要提供完整的路径名。

execl 函数

  1. 原型

    #include <unistd.h>
    int execl(const char *path, const char *arg, ...);
    
  2. 功能execl函数用来执行一个文件,并将控制权转交给这个新程序。当调用成功时,原有进程的内容(代码段、数据段和堆栈等)将被新程序的内容取代,execl函数不会返回。

  3. 参数

    • path:要执行的程序的路径。
    • arg:传递给新程序的参数列表,最后一个参数需要是NULL,以标识参数列表的结束。
  4. 返回值

    • 如果调用成功,execl函数不会返回。
    • 如果调用失败(例如找不到指定的文件或没有足够的内存等),则返回-1,并设置errno来指示错误类型。
  5. execl函数后面的字母“l”代表的是“list”,意味着该函数通过参数列表的方式来传递参数

  6. 示例:

    使用execl函数来执行ls命令

    #include <stdio.h>
    #include <unistd.h>
    int main(int argc, const char *argv[])
    {
    	if(execl("/bin/ls","ls","-a","-l","./",NULL)<0)
    	{
    		perror("execl");
    	}
    	return 0;
    }
    

    编译运行a.out 和 shell命令$ls -a -l 做对比

    在这里插入图片描述

    运行效果一致

execlp 函数

  1. 原型

    #include <unistd.h>
    int execlp(const char *file, const char *arg, ...);
    
  2. 功能execlp函数用于在当前进程中执行指定的可执行文件,并用该新程序替换当前进程的映像。

  3. 参数

    • file:要执行的程序的文件名(或路径),不需要带扩展名,因为系统会自动根据文件名查找可执行文件。
    • arg:传递给新程序的参数列表,最后一个参数需要是NULL,以标识参数列表的结束。
    • ...:可选参数,可以传递多个,每个参数都会按顺序传递给新程序。
  4. 返回值

    • 如果调用成功,execlp函数不会返回。
    • 如果调用失败,则返回-1,并设置errno来指示错误类型。

execv 函数

  1. 原型

    #include <unistd.h>
    int execv(const char *path, char *const argv[]);
    
  2. 功能execv函数用来执行一个文件,并将控制权转交给这个新程序。与execl相似,当调用成功时,原有进程的内容(代码段、数据段和堆栈等)将被新程序的内容取代,execv函数不会返回。

  3. 参数

    • path:要执行的程序的路径。
    • argv:传递给新程序的参数数组,其中argv[0]通常是被执行文件的路径,数组的最后一个元素应该是NULL,以标识参数列表的结束。
  4. 返回值

    • 如果调用成功,函数不会返回。
    • 如果调用失败,则返回-1,并设置errno来指示错误类型。

execvp 函数

  1. 原型

    #include <unistd.h>
    int execvp(const char *file, char *const argv[]);
    
  2. 功能execvp函数用于在当前进程中执行指定的可执行文件,并用该新程序替换当前进程的映像。

  3. 参数

    • file:要执行的程序的文件名(或路径),不需要带扩展名,因为系统会自动根据文件名查找可执行文件。
    • argv:传递给新程序的参数数组,其中argv[0]通常是被执行文件的路径,数组的最后一个元素应该是NULL,以标识参数列表的结束。
  4. 返回值

    • 如果调用成功,execvp函数不会返回。
    • 如果调用失败,则返回-1,并设置errno来指示错误类型。
  5. 示例

    使用execvexecvp函数来执行ls命令

    #include <stdio.h>
    #include <unistd.h>
    int main(int argc, const char *argv[])
    {
    char *arg[] = {“ls”,-a”,-l”,/etc”, NULL};
    if  (execv(/bin/ls”, arg) < 0) {
    perror(“execv”);
    }  
    if  (execvp(“ls”, arg) < 0) {
    perror(“execvp”);
    }  
    	return 0;
    }
    

    运行效果同上

system 函数

  1. 原型

    #include <stdlib.h>
    int system(const char *command);
    
  2. 功能system函数用于在当前进程中创建一个子进程,并在子进程中执行一个shell命令。该函数会等待命令执行完成后返回。

  3. 参数

    • command:指向以空字符终止的字符串的指针,该字符串包含要在子进程中执行的命令。
  4. 返回值:如果system函数成功执行了指定的命令,它将返回命令的退出状态。如果发生错误或命令无法执行,则返回-1。通常,返回值是shell的退出代码,可以通过WEXITSTATUS(status)宏来获取。

  5. 注意system函数的使用可能会带来安全风险,因为它允许执行任意的shell命令。因此,在安全性要求较高的环境中,应该避免使用system函数,或者至少对输入的命令进行严格的检查和限制。

  6. 示例

    #include <studio.h>
    #include <stdlib.h>
    int main()
    {
        system("ls -a -l ./");
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA实验项目(二): 抽象类、接口的定义与使用

实验项目二 抽象类、接口的定义与使用 Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&…

Python游戏开发库:开启游戏编程之旅

引言 Python凭借其简洁明了的语法和丰富的库支持&#xff0c;在游戏开发领域占有一席之地。对于希望进入游戏编程世界的开发者来说&#xff0c;Python提供了一个理想的起点。本文将介绍几个关键的Python游戏开发库&#xff0c;帮助您开启游戏编程之旅。 第一部分&#xff1a;P…

Selenium自动操作鼠标的方法及示例(鼠标左右键单击、左键双击、拖动等)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【线性系统理论】笔记一

一&#xff1a;状态空间表达式 电路系统状态空间描述列写 1&#xff1a;选取状态变量 状态变量定义&#xff1a;线性无关极大组属性。 2&#xff1a;列出电路原始回路方程 ps&#xff1a;状态变量有两个&#xff0c;理论上需要列写2个方程 3&#xff1a;规范形势 4&#xf…

基于Springboot的知名作家信息管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的知名作家信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

计算思维的理解

2006年&#xff0c;卡内基梅隆大学周以真教授首次系统性地定义了计算思维。这一年&#xff0c;她在美国计算机权威期刊《Communications of the ACM》上发表了题为《Computational Thinking》的论文&#xff0c;由此开启了计算思维大众化的全新历程。 周以真&#xff08;Jeanne…

3.3 整型

本节必须掌握的知识点&#xff1a; 整型数据类型的取值范围 示例八 代码分析 汇编解析 获取数据类型的取值范围 3.3.1 整型数据类型取值范围 整型是用来表示限定范围内连续整数的数据类型。表3-1列出了C语言编译器定义的整型数据类型及其大小和取值范围。 类型 存储大小…

三菱FX3U-4AD模拟量电压输入采集实例

硬件&#xff1a;&#xff30;&#xff2c;&#xff23;模块 &#xff26;&#xff38;&#xff13;&#xff27;&#xff21;-&#xff12;&#xff14;&#xff2d;&#xff34; &#xff1b;&#xff21;&#xff0f;&#xff24;模块&#xff26;&#xff38;&#xff13…

食品饮料厂做配送小程序的作用是什么

食品饮料厂品牌旗下通常有多个产品类型&#xff0c;多数是以批发为主&#xff0c;也有直营店及线上直播零售等方式&#xff0c;商家如何将品牌宣传和产品销售的更广是需要思考的&#xff0c;其销售模式也多种多样。 私域店铺也是品牌增长的重要方式&#xff0c;在【雨科】平台…

【现代C++】范围库的应用

C20引入了范围库&#xff08;Ranges library&#xff09;&#xff0c;它是标准模板库&#xff08;STL&#xff09;的一个扩展&#xff0c;提供了一种新的方式来处理序列和范围。这个库允许开发者以更声明式的方式编写代码&#xff0c;使得操作序列变得更简洁、更易读。以下是C范…

深入理解 npm、cnpm、npx、yarn 和 pnpm:JavaScript 包管理器的对比

在 JavaScript 的世界中&#xff0c;包管理器是一个重要的工具&#xff0c;它帮助我们管理、安装和升级项目的依赖。在这篇文章中&#xff0c;我们将深入探讨三个最流行的 JavaScript 包管理器&#xff1a;npm、yarn 和 pnpm。 npm&#xff08;Node Package Manager&#xff0…

电源模块效率的正确测试方法

电源效率是评价电源性能的重要指标&#xff0c;它直接关系到设备的稳定性和能源的利用效率。因此&#xff0c;对电源进行效率测试显得尤为重要。电源在工作过程中&#xff0c;会有部分能量损耗&#xff0c;因此&#xff0c;电源效率的高低&#xff0c;不仅影响着设备的性能&…

VMware虚拟机没有网,无法设置网络为桥接状态

今天需要使用Ubuntu18但现有虚拟机是Ubuntu20&#xff0c;由于硬盘空间不够大&#xff0c;所以删除了原来的虚拟机并重新搭建Ubuntu18的环境&#xff0c;然后发现虚拟机没有网络&#xff0c;而我之前的虚拟机这一切都是正常的。 在网络设置里勾选的是桥接模式但无法联网&#x…

奥维地图下载高清影像的两种方式!以及ArcGIS、QGIS、GlobalMapper、自编工具下载高清影像的方法推荐!

今天来介绍一下奥维互动地图是如何下载高清影像的&#xff0c;也不是多了不起的功能&#xff01;有朋友问&#xff0c;加上这个软件确实用的人多。 下载的高清数据在ArcGIS中打开的效果&#xff01; 开始介绍奥维之前我们也介绍一下我们之前介绍的几个方法&#xff0c;没有优劣…

面试加分项:精通Java高并发下的锁优化策略

1. 问题背景与挑战 1.1 并发编程中的挑战 在现代软件开发中&#xff0c;高并发已成为衡量系统质量的一项关键因素&#xff0c;特别是对于那些需要同时处理数以万计甚至百万级用户请求的服务。并发编程的挑战在于如何有效地同步多个线程&#xff0c;确保数据的一致性和系统的稳…

【csv-parse】使用parse方法的时候来转换为csv字符串时,会导致输出有乱码

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;前端bug记录 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续前进…

针对实拍场景的虚拟试衣模型IDM-VTON:高保真和细节保留的虚拟试穿算法,真实环境效果领先

前言 虚拟试衣是一种将人物图像与服装图像合成&#xff0c;生成人物穿戴目标服装的图像技术。相比传统的GAN方法&#xff0c;基于扩散模型的虚拟试衣方法能够生成更加自然逼真的图像。然而&#xff0c;现有的扩散模型在保留服装细节方面仍存在局限性。 为了解决这一问题&…

Nodejs 第七十一章(libuv)

libuv 在Node.js中&#xff0c;libuv是作为其事件循环和异步I/O的核心组件而存在的。Node.js是构建在libuv之上的&#xff0c;它利用libuv来处理底层的异步操作&#xff0c;如文件I/O、网络通信和定时器等。 libuv在Node.js中扮演了以下几个重要角色&#xff1a; 事件循环&a…

一个panic问题引起对percpu变量的思考

1 问题引入 最近在分析一个panic问题时&#xff0c;发现panic现场无法与log对应起来。 先贴log: <1>[ 180.089084] Unable to handle kernel NULL pointer dereference at virtual address 00000001 <1>[ 180.099551] pgd 8bbde651 <1>[ 180.107775] …

JavaScript进阶——05-迭代器和生成器【万字长文,感谢支持】

迭代器 概念 迭代器&#xff08;Iterator&#xff09;是 JavaScript 中一种特殊的对象&#xff0c;它提供了一种统一的、通用的方式遍历个各种不同类型的数据结构。可以遍历的数据结构包括&#xff1a;数组、字符串、Set、Map 等可迭代对象。我们也可以自定义实现迭代器&…