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

news2024/12/23 20:00:27

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 ./");
    }
    

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

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

相关文章

【MySQL】Mysql——卸载文档(windows版本)

MySQL卸载文档-Windows版 1. 停止MySQL服务 winR 打开运行&#xff0c;输入 services.msc 点击 “确定” 调出系统服务。 停止Mysql服务 2. 卸载MySQL相关组件 打开控制面板 —> 卸载程序 —> 卸载MySQL相关所有组件 3. 删除MySQL安装目录 4. 删除MySQL数据目录 数…

代码随想录算法训练营第二十八天 | 216.组合总和III 、17.电话号码的字母组合

216.组合总和III 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a;和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.组合总和III_哔哩哔哩_bilibili 解题思路 整体的思路和77题是一样的&#xff0c;这里只是多加了个一个…

记录一期Typecho WebShell木马渗透的经历

我创建了一个Typecho的轻量博客,之前一直是本地运行,最近才上了公网,平时自己也是粗心大意,把密码也写在第一篇博文里面 有一天,我突发奇想的想要提交更新,本博客是通过git进行代码版本管理的避免自己修改官方源码出现了问题,无法还原,也定时备份SQL, 然后莫名其妙的发现多了…

苍穹外卖-day01(SpringBoot+SSM的企业级Java项目实战)

苍穹外卖-day01 课程内容 软件开发整体介绍 苍穹外卖项目介绍 开发环境搭建 导入接口文档 Swagger 项目整体效果展示&#xff1a; 管理端-外卖商家使用 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为…

LeetCode题练习与总结:不同的二叉搜索树--96

一、题目描述 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&…

tensorflow实现二分类

# 导入所需库和模块 from tensorflow.keras.layers import Dense, Input, Activation # 导入神经网络层和激活函数模块 from tensorflow.keras.models import Sequential # 导入Keras的Sequential模型 import pandas as pd # 导入Pandas库用于数据处理 import numpy as np …

深度学习设计模式之简单工厂模式

文章目录 前言一、简单工厂设计模式的作用&#xff1f;二、详细分析1.核心组成2.实现步骤3.示例代码4.优缺点优点缺点 5.使用场景 总结 前言 本文主要学习简单工厂设计模式&#xff0c;这个设计模式主要是将创建复杂对象的操作单独放到一个类中&#xff0c;这个类就是工厂类&a…

20【Aseprite 作图】画岩石

1 画一个岩石的框架,不是一个正规的圆,可以把最高点不放在中心,会显得自然 2 用油漆桶填满框架 3 要改变岩石的颜色,可以调整HSV里面的S,降低饱和度 4 描边,和地面连接处可以不描边 5 颜色调得更浅一点,(通过HSV里面的S可以做到),作为亮处的轮廓; 通过把透明度调…

【LAMMPS学习】八、基础知识(6.6)在 Windows 10 上使用 LAMMPS 和 WSL

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

uniapp 微信小程序使用ec-canvas图表

微信小程序中使用到了ec-canvas图表&#xff0c;从DCloud插件市场中下载echarts-for-wx&#xff1b; 在uniapp项目中找到js-sdk文件夹&#xff0c;把其中的uni-ec-canvas放到要用的包的components中。 在文件中导入&#xff1a; 饼图&#xff1a; <template><view…

嵌入式学习——Shell(流指针、文件读写函数)——day20

1. 标准IO和文件IO的区别 1. 标准IO是一种有缓存的IO形式&#xff08;接收了一部分内容后给到linux内核中&#xff09; 2. 文件IO是一种没有缓存的IO形式&#xff08;即刻交给linux内核&#xff0c;及时性&#xff09; 3. 标准IO是库函数,库函数可以在Windows和Linux系统中都能…

使用docker创建hadoop集群:Couldn‘t upload the file

运行的环境; Windows10 Docker Desktopdocker-hadoop 出现的问题如下: 解决方法 https://github.com/big-data-europe/docker-hadoop/issues/98

喜大普奔!VMware Workstation Pro 17.5 官宣免费!

Broadcom 已经正式收购 VMware&#xff0c;【VMware中国】官方公众号已于3月11日更名为【VMware by Broadcom中国】。 13日傍晚&#xff0c;该公众号发表推文 V风拂面&#xff0c;好久不见 - 来自VMware 中国的问候 &#xff0c;意味着 VMware 带着惊喜和美好的愿景再次归来。 …

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

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

Git 基础使用(2) 分支管理

文章目录 分支概念分支使用查看分支分支创建分支切换分支合并合并冲突分支删除 分支管理快进模式分支策略内容保存错误处理 分支概念 &#xff08;1&#xff09;分支概念 Git分支是指在版本控制系统Git中&#xff0c;用来表示项目的不同工作流程或开发路径的一个重要概念。通过…

学习Nginx(一):基础

介绍 Nginx是一个高性能的HTTP和反向代理的web服务器&#xff0c;它的设计重点是高并发、高性能和低内存消耗。它常被用于提供静态内容、负载均衡和作为Web服务器。 Nginx具有以下功能和特点&#xff1a; 静态文件服务&#xff1a;作为一个Web服务器&#xff0c;Nginx可以处…

SpringBoot解决CORS跨域——@CrossOrigin

前端请求后端报错了。 状态码&#xff1a;403 返回错误&#xff1a;Invalid coRs request 一个注解就搞定了。 在类上加 CrossOrigin

队列的讲解

队列的概念 队列:只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 一端进另一端出 也就是可以做到&#xff0c;先…

数据结构与算法-排序算法3-插入排序

目录 1.插入排序&#xff1a; 1.介绍&#xff1a; 2.动态图解 3.举例 4.小结插入排序规则 5.插入排序代码 6.运行时间 代码&#xff1a; 运行结果&#xff1a; 1.插入排序&#xff1a; 1.介绍&#xff1a; 数组中n个元素&#xff0c;把这n个待排序元素看成一个有序序…

01 Triton backend

1 整体架构 三部分组成&#xff1a; Triton backend tensorRT_backend、onnx_backend、tfs_backend、torch_backend **Triton model ** 不同的模型 **Triton model instance ** 模型实例 ![P2}5X%2ULV(2OAC$_OKOP.png 2 设计思路 需要实现七个接口&#xff1a; TRITON…