当前位置: 首页 > news >正文

Linux之进程控制(下)

目录

进程替换的概念

进程替换的函数

execl​编辑

execlp

execle

 execv

execvp

execve


上期,我们学习了进程创建,进程终止和进程等待,今天我们要学习的是进程控制中相对重要的板块------进程替换。

进程替换的概念

在进程创建时,我们使用了fork函数创建了子进程。但是大家仔细回想一下,其实在子进程创建之后,父子进程共享的是同一代码,可以理解为子进程执行的是父进程代码的一部分,有没有什么办法可以让子进程不去执行父进程的代码,而去执行一份新的代码呢?进程替换就是其中的方法之一。

进程替换:进程替换是指替换到原有进程的代码,但是原有的进程的数据结构不变的技术,就叫做进程替换。

替换原理图示如下。

 由图示可见,进程替换其实是没有新进程的创建的,只是更改了之前进程代码以及虚拟地址空间和页表之间的对应关系。所以进程替换的代价相对而言是比较小的。

进程替换的函数

进程替换主要要用到exec类的函数,用于去执行另一个程序的代码。exec函数主要有六个,我们一一来解释。

execl

参数:第一个参数为要执行的命令的路径,第二个参数为命令行参数,即命令要执行什么,但是最终必须以NULL结尾,不然会出错。

先看下述代码。

这是一个简单的打印程序。运行结果如下:

然后使用execl函数进行替换。

#include<stdio.h>
#include<unistd.h>int main()
{printf("process begin\n");execl("/usr/bin/ls","ls","-a","-l",NULL);printf("process end\n");return 0;
}

运行结果如下。

我们惊奇的发现,"process end"字符串没有打印,这是为什么呢?

原因就是在进行进程替换之后,当前进程的所有代码都被进行了替换,之前的和之后的代码都被进行了替换,所以替换之后的代码自然没有被执行,所以自然没有打印对应的语句。 

execlp

参数列表:第一个参数为要执行的命令的名称,第二个参数为命令函参数,与execl要求类似。

 代码如下。

#include<stdio.h>
#include<unistd.h>int main()
{printf("process begin\n");execlp("ls","ls","-a","-l",NULL);printf("process end\n");return 0;
}

运行结果如下。

我们发现运行结果也符合我们的预期。

execle

参数列表:第一个参数为命令的路径,第二个参数为命令行参数与execl类似,第三个参数为环境变量参数。 

代码如下。

#include<stdio.h>
#include<unistd.h>int main()
{printf("process begin\n");char *env[]={"hello world","hello world","hello yjd"};execle("/usr/bin/ls","ls","-a","-l",NULL,env);printf("process end\n");return 0;
}

运行结果如下。

运行结果符合预期。

 execv

 

参数列表:第一个参数为命令的路径,第二个参数为命令行参数组成的一个指针数组。

代码如下。

#include<stdio.h>
#include<unistd.h>int main()
{printf("process begin\n");char* const argv[]={"ls","-a","-l",NULL};execv("/usr/bin/ls",argv);printf("process end\n");return 0;
}

 运行结果如下。

运行结果符合预期。

execvp

参数列表:第一个参数为命令名称,第二个参数为命令行参数组成的指针数组。

代码如下。

#include<stdio.h>
#include<unistd.h>int main()
{printf("process begin\n");char* const argv[]={"ls","-a","-l",NULL};execvp("ls",argv);printf("process end\n");return 0;
}

运行结果如下。

运行结果符合预期。

execve

 这个接口是系统调用接口,其它六个exec类函数都是库函数接口,证明其它六个exec函数与execve函数肯定是有关系的,具体什么关系我们等下再去讨论。

参数列表:第一个参数为命令路径,第二个参数为命令行参数组成的指针数组,第三个参数为环境变量组成的指针数组。 

代码如下。

#include<stdio.h>
#include<unistd.h>int main()
{printf("process begin\n");char* const env[]={"hello world","hello world","hello yjd",NULL};char* const argv[]={"ls","-a","-l",NULL};execve("/usr/bin/ls",argv,env);printf("process end\n");return 0;
}

运行结果如下。

运行结果如何预期。

回到刚开始的问题execve函数与其它几个函数有什么区别呢?

可以理解为除过execve函数之外的其它函数的本质都是execve函数,因为execve函数是系统调用接口,而除execve之外的其它函数都是第三方库的接口,我们知道库函数的实现本质上是系统调用函数的实现。

以上便是本期进程替换的所有内容,到了这里进程控制的所有内容已经全部学习完毕。

本期内容到此结束^_^

 

 

相关文章:

Linux之进程控制(下)

目录 进程替换的概念 进程替换的函数 execl​编辑 execlp execle execv execvp execve 上期&#xff0c;我们学习了进程创建&#xff0c;进程终止和进程等待&#xff0c;今天我们要学习的是进程控制中相对重要的板块------进程替换。 进程替换的概念 在进程创建时&…...

Mac搭建anaconda环境并安装深度学习库

1. 下载anaconda安装包 根据自己的操作系统不同&#xff0c;选择不同的安装包Anaconda3-2024.06-1-MacOSX-x86_64.pkg&#xff0c;我用的还是旧的intel所以下载这个&#xff0c;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/&#xff0c;如果mac用的是M1&#xff0…...

Linux:文件系统与日志分析

一、block与inode 1.1、概述 文件是存储在硬盘上的&#xff0c;硬盘的最小存储单位叫做“扇区”(sector)&#xff0c;每个扇区存储512字节。 一般连续八个扇区组成一个"块”(block)&#xff0c;一个块是4K大小&#xff0c;是文件存取的最小单位。 文件数据包括实际数据…...

迈阿密色主题学科 HTML5静态导航源码

源码介绍 迈阿密色主题学科 HTML5静态导航源码&#xff0c;源码直接上传可用&#xff0c;有技术的可以拿去写个后端搜索调用百度接口&#xff0c;也可用于做引导页下面加你网址添加一个A标签就行了&#xff0c;很简单&#xff0c;需要的朋友就拿去吧 界面预览 源码下载 迈阿…...

Qt 基础组件速学 鼠标和键盘事件

学习目标&#xff1a; 鼠标事件和键盘事件应用 前置环境 运行环境:qt creator 4.12 学习内容和效果演示&#xff1a; 1.鼠标事件 根据鼠标的坐标位置&#xff0c;做出对应的事件。 2.键盘事件 根据键盘的输入做出对应操作 详细主要代码 1.鼠标事件 #include "main…...

【踩坑】解决undetected-chromedriver报错cannot connect to-chrome

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 更新&#xff1a; 发现一个非常好用的项目&#xff0c;直接内置uc&#xff1a; GitHub - seleniumbase/SeleniumBase: &#x1f4ca; Pythons all-in…...

PyCharm 2024.1 版本更新亮点:智能编程,高效协作

目录 1. 前言2. 更新内容2.1 智能编码体验2.1.1 Hugging Face 文档预览2.1.2 全行代码补全 2.2 提升编辑器体验2.2.1 粘性行功能2.2.2 编辑器内代码审查 2.3 全新终端体验&#xff08;测试版&#xff09;2.3.1 新终端 Beta 2.4 智能助手&#xff08;特定版本和专业用户&#xf…...

网络安全设备——蜜罐

网络安全设备蜜罐&#xff08;Honeypot&#xff09;是一种主动防御技术&#xff0c;它通过模拟真实网络环境中的易受攻击的目标&#xff0c;以吸引和监测攻击者的活动。具体来说&#xff0c;蜜罐是一种虚拟或实体的计算机系统&#xff0c;它模拟了一个真实的网络系统或应用程序…...

Java与Selenium配置及常见报错解决方法

Java与Selenium配置及常见报错解决方法 1. 简介 Java与Selenium是自动化测试中常用的工具和技术。正确配置开发环境并处理可能出现的问题&#xff0c;对于顺利开展测试工作至关重要。本文将为您详细介绍Java与Selenium的配置过程&#xff0c;并提供常见报错的解决方法。 2. …...

最新扣子(Coze)实战案例:使用图像流做超分,模糊图片秒变清晰,完全免费教程

&#x1f9d9;‍♂️ 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI应用。 &#x1f4dc; 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》&#xff0c;完全免费学习。 &#x1f440; 关注斜杠君&#xff0c;可获取完整版教程。&#x1f44d;&#x1f3f…...

数组相关内容

一、数组 就是一个集合&#xff0c;里面存放了相同类型的数据元素 特点&#xff1a; 1.数组中的每个数据元素都是相同的数据类型 2.数组是由连续内存位置组成的 二、一维数组 定义方式 1.数据类型 数组名[数组长度]&#xff1b; 2.数据类型 数组名[数组长度]{值1&#xff0…...

【Python机器学习】模型评估与改进——打乱划分交叉验证

打乱划分交叉验证是一种非常灵活的交叉验证策略。 在打乱划分交叉验证中&#xff0c;每次划分为训练集取样train_size个点&#xff0c;为测试集取样test_size个不相交的点。将这一划分方法重复n_iter次。 举例&#xff1a; import matplotlib.pyplot as plt import mglearnm…...

nodejs操作excel文件实例,读取sheets, 设置cell颜色

本代码是我帮客户做的兼职的实例&#xff0c;涉及用node读取excel文件&#xff0c;遍历sheets&#xff0c;给单元格设置颜色等操作&#xff0c;希望对大家接活有所帮助。 gen.js let dir"Z:\\武汉烟厂\\山东区域\\备档资料\\销区零售终端APP维护清单\\走访档案\\2024年6月…...

用GPT做足球预测案例分享

自从GPT出来后&#xff0c;一直想利用GPT的能力做点什么&#xff0c;想了很多项目&#xff0c;比如用GPT写小说&#xff0c;用GPT做股票分析&#xff0c;用GPT写营销文章&#xff0c;最终我选了一个比较有意思的方向&#xff1a;GPT足球预测。因为每天都有足球比赛&#xff0c;…...

代码随想录| 编辑距离

判断子序列[https://leetcode.cn/problems/is-subsequence/description/] 题意&#xff1a;给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 思路&#xff1a;从动态规划&#xff0c; dp[i][j] 表示s的前i-1个元素和t的前j-1个元素相同的子序列元素的个数。 还要对d…...

MOJO编程语言的编译与执行:深入编译器与解释器的工作原理

引言 MOJO编程语言以其面向对象的特性和简洁的语法而受到开发者的欢迎。在MOJO的世界中&#xff0c;编译器和解释器是两个核心组件&#xff0c;它们负责将MOJO代码转换为机器可执行的指令。本文将探讨MOJO编译器和解释器的工作原理&#xff0c;以及它们如何在MOJO编程过程中发…...

nginx-限制客户端并发数

文章目录 前言一、ngx_http_limit_conn_module二、指令介绍1. limit_conn_zone2.limit_conn3. limit_conn_log_level4. limit_conn_status 案例未限制限制 总结 前言 瞬时大量用户访问服务器&#xff0c;导致服务器超载而宕机。 恶意请求攻击服务器&#xff0c;导致服务器超载…...

Vatee万腾平台:智能生活的新选择

在科技飞速发展的今天&#xff0c;智能生活已经不再是遥不可及的梦想&#xff0c;而是逐渐渗透到我们日常生活的方方面面。Vatee万腾平台&#xff0c;作为智能科技领域的佼佼者&#xff0c;正以其创新的技术、丰富的应用场景和卓越的用户体验&#xff0c;成为智能生活的新选择&…...

白嫖A100-interLM大模型部署试用活动,亲测有效-2.Git

申明 以下部分内容来源于活动教学文档&#xff1a; Docs git 安装 是一个开源的分布式版本控制系统&#xff0c;被广泛用于软件协同开发。程序员的必备基础工具。 常用的 Git 操作 git init 初始化一个新的 Git 仓库&#xff0c;在当前目录创建一个 .git 隐藏文件夹来跟踪…...

LeetCode 60.排序排列(dfs暴力)

给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; "123""132""213""231""312""321" 给定…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...