【并发程序设计】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 ./");
    }
    

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

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

相关文章

【YOLOV5 入门】——Gradio搭建Web GUI

引入&#xff1a;上节搭建的UI可视化界面只能以运行程序弹出窗口的形式运行&#xff0c;不能在网页Web中使用&#xff0c;本次代码将会非常少&#xff01; 一、Gradio简介与安装 Gradio 是一个用于构建机器学习模型演示界面和Web应用的开源库。提供了简单易用的界面&#xff0…

云端的艺术革命:云渲染如何重塑动画与视觉特效产业

在 2019 年&#xff0c;乔恩费儒&#xff08;Jon Favreau&#xff09;决定重拍迪士尼的经典电影《狮子王》。他的创新构想是以真实动物为模型&#xff0c;在非洲草原上拍摄&#xff0c;由真实动物“出演”的辛巴和其他角色&#xff0c;随后通过配音赋予它们生命。 为了实现这一…

janus源码分析(1)--代码结构整理

基础说明 janus官网 https://janus.conf.meetecho.com/index.html janus源码地址 https://github.com/meetecho/janus-gateway 编译及部署参考 https://pro-hnb.blog.csdn.net/article/details/137730389?spm1001.2014.3001.5502 https://pro-hnb.blog.csdn.net/article/deta…

【Python探索之旅】列表

目录 特点 入门 访问元素 新增元素 修改元素 插入元素 删除元素 完结撒花 前言 在Python中&#xff0c;列表(List)是最常用的数据结构之一&#xff0c;类似于其他语言&#xff0c;如Java&#xff0c;与其不同啊Python中不需要声明数据类型。它提供了一种灵活且高效的方式…

Linux-线程

目录 1. 线程概念 2. 线程vs进程 3. 线程的优缺点 4. 线程创建 4.1 pthread_create 4.2 pthread_self 5. 线程终止 5.1 return 5.2 pthread_exit 5.3 pthread_cancel 6. 线程等待 7. 线程分离 1. 线程概念 线程&#xff1a;轻量级进程&#xff0c;在进程内部执行&a…

谷歌Gemini时代来了!加固搜索护城河、赋能全家桶,Gemini 1.5 Pro升级至200万token

3 月中旬&#xff0c;谷歌宣布 Google I/O 定档北京时间 5 月 15 日凌晨 1 点。而当大会开幕时间临近&#xff0c;本应是讨论度最高的时候&#xff0c;「宿敌」OpenAI 却半路杀出&#xff0c;抢先一天&#xff0c;仅耗时 27 分钟就发布了颠覆性巨作 GPT-4o&#xff0c;将新一轮…

PyTorch中定义自己的数据集

文章目录 1. 简介2. 查看PyTorch自带的数据集(可视化)3. 准备材料3.1 图片数据3.2 标签数据 4. 方法 1. 简介 尽管PyTorch提供了许多自带的数据集&#xff0c;如MNIST、CIFAR-10、ImageNet等&#xff0c;但它们对于没有经验的用户来说&#xff0c;理解数据加载器的工作原理以及…

【启程Golang之旅】环境设置、工具安装与代码实践

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

【Web后端】MVC模式

1、简介 MVC模式&#xff0c;全称Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式&#xff0c;是一种软件设计典范&#xff0c;它将应用程序的用户界面&#xff08;视图&#xff09;和业务逻辑&#xff08;模型&#xff09;分离&#xff0c;同时提供了一个…

K8S内容

K8S介绍 1、故障迁移:当某一个node节点关机或挂掉后&#xff0c;node节点上的服务会自动转移到另一个node节点上&#xff0c;这个过程所有服务不中断。这是docker或普通云主机是不能做到的 2、资源调度:当node节点上的cpu、内存不够用的时候&#xff0c;可以扩充node节点&…

​​​【收录 Hello 算法】6.2 哈希冲突

目录 6.2 哈希冲突 6.2.1 链式地址 6.2.2 开放寻址 1. 线性探测 2. 平方探测 3. 多次哈希 6.2.3 编程语言的选择 6.2 哈希冲突 上一节提到&#xff0c;通常情况下哈希函数的输入空间远大于输出空间&#xff0c;因此理论上哈希冲突是不可避免的。比如&a…

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

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

从需求角度介绍PasteSpider(K8S平替部署工具)

你是否被K8S的强大而吸引&#xff0c;我相信一部分人是被那复杂的配置和各种专业知识而劝退&#xff0c;应该还有一部分人是因为K8S太吃资源而放手&#xff01; PasteSpider是一款使用c#编写的linux容器部署工具&#xff0c;简单易上手&#xff0c;非常节省资源&#xff0c;支持…

shell脚本实现linux系统自动化配置免密互信

目录 背景脚本功能脚本内容及使用方法 1.背景 进行linux自动化运维时需要先配置免密&#xff0c;但某些特定场景下&#xff0c;做了互信的节点需要取消免密&#xff0c;若集群庞大节点数量多时&#xff0c;节点两两之间做互信操作非常麻烦&#xff0c;比如有五个节点&#x…

C++——动态规划

公共子序列问题 ~待补充 最长公共子序列 对于两个字符串A和B&#xff0c;A的前i位和B的前j位的最大公共子序列必然是所求解的一部分&#xff0c;设dp[i][j]为串A前i位和B串前j位的最长公共子序列的长度&#xff0c;则所求答案为dp[n][m]&#xff0c;其中n&#xff0c;m分别为…

微信小程序主体变更的操作教程

小程序迁移变更主体有什么作用&#xff1f;进行小程序主体迁移变更&#xff0c;那可是益处多多呀&#xff01;比方说&#xff0c;能够解锁更多权限功能&#xff1b;在公司变更或注销时&#xff0c;还能保障账号的正常使用&#xff1b;此外&#xff0c;收购账号后&#xff0c;也…

详解xlsxwriter 操作Excel的常用API

我们知道可以通过pandas 对excel 中的数据进行处理分析&#xff0c;但是pandas本身对格式化数据方面提供了很少的支持&#xff0c;如果我们想对pandas进行数据分析后的数据进行格式化相关操作&#xff0c;我们可以使用xlsxwriter&#xff0c;本文就对xlsxwriter的常见excel格式…

Salesforce AI研究: 从奖励建模到在线RLHF工作流

摘要 该研究在本技术报告中介绍了在线迭代基于人类反馈的强化学习(Online Iterative Reinforcement Learning from Human Feedback, RLHF)的工作流程,在最近的大语言模型(Large Language Model, LLM)文献中,这被广泛报道为大幅优于其离线对应方法。然而,现有的开源RLHF项目仍然…

Android存储文件路径的区别

一、Android存储简介 Android系统分为内部存储和外部存储 从Android6.0开始不断在更新存储权限 外部存储路径的开头&#xff1a;storage/emulated/0 内部存储文件路径的开头&#xff1a;/data/user/0/应用的包名&#xff08;packageName&#xff09; 在设备上对应的目录为/data…

Linux的命名管道 共享内存

目录 命名管道 mkfifo函数 unlink函数 命名管道类 服务端 客户端 共享内存 shmget函数 ftok函数 key和shmid的区别 snprintf函数 ipcs指令 ipcrm指令 shmctl函数 shmat函数 void*做返回值 创建共享内存空间 服务端 客户端 命名管道 基本概念&#xff1…