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

Linux的进程替换以及基础IO

进程替换

上一篇草率的讲完了进程地址空间的组成结构和之间的关系,那么我们接下来了解一下程序的替换。

首先,在进程部分我们提过了,其实文件可以在运行时变成进程,而我们使用的Linux软件其实也是一个进程,所以进一步来说,我们在Linux里写的一切文件都是子进程,而进程的替换一般就发生在父子进程之间,我们先了解一下它的特性,首先如果使用了进程替换,那么它会在替换处直接取代原有代码,覆盖式的运行,所以并不会产生新的子进程,也不会减少进程。所以一旦替换成功,之后的代码都会被覆盖不会执行。

那么我们接下来认识一下替换的方法:

exec系列

可以根据情况来使用这个系列进行替换。

execl 

这里的 L 其实就代表 List 所以我们需要在参数结束时额外提供一个NULL给它辨认。

首先我们提供了一个路径给它,因为它需要我们给路径,然后它去找到路径然后执行。

之后我们紧跟着提供我们要执行的命令,当然你闲麻烦可以直接 " -al " ,最后最重要的是给一个NULL。

可以看到正如我们所料,在替换之前的内容被打印了,然后程序被替换成了 ls -al

而我们的  替换结束  这句话并没有被打印,因为是覆盖式替换。

上面是替换成功的情况,那么替换如果失败,则有一个值为-1的返回值,这个系列的接口只有失败才会有返回值,毕竟成功就运行了。

可以看到确实如此。

execlp

先上图

它们俩之间,其实并没有区别,只不过一个给了具体路径,一个没给,没给的那个是因为人家有path环境变量给系统带路呢。所以我们的execlp里的P就是Path,在这个接口,我们可以不用提供具体的路径给它,就像我们平时使用一般给个 ls 就好了(当然你想给全路径也行),系统会自己去path里找的,所以相对的,这个接口比较适合那些系统自带的命令使用,或者你不嫌麻烦把自己的路径添加进去也行。

它的用法也确实很简单,毕竟有了execl的前车之鉴,结果也不出所料。

execv

这里的V代表的就是Vector,当然了,它没带p所以第一个参数得给具体路径。

实际上它就是支持你把参数先放进数组里,然后一次性传进来,当然它为了防止类型的问题,所以可能会需要你进行强转保险。

所以衍生一下 execvp 想必我不说大伙也该知道咋用了。

execvpe

新BOSS来了,v和p我们都知道了,e是什么呢,e是环境变量,不过它用起来有点麻烦,大伙要先知道每个进程都有属于自己的环境变量,即使是子进程,也是使用父进程的环境变量,但是使用execvpe如果你传入了环境变量,那么它就会使用你传入的而不去使用旧的,但是如果你既想用旧的又想有新的,那可以直接追加。

这个追加的内容最好放在全局,然后就产生两条路了,如果你就想给个一两个,那么直接

这样你要追加的环境变量就会追加到原有的后面,然后你不要用 e 系列接口了,直接继续用execvp就好了。   这个putenv只会从你这里开始生效,也就是说如果你还有子进程,那它也可以看见这个新追加的,但是你的父进程就看不到了,因为这里发生了写实拷贝。

而如果你想追加很多新环境变量,还就想用 e 系列,那你就得

这样还是得先利用全局的数组去遍历的追加,然后putenv追加进去,最后

声明出来以后再把这个 environ 当环境变量传进去,这个environ就是原有的环境变量和追加的环境变量结合后的结果。

进程替换的实际使用

这就需要结合我们之前的父子进程了,我们在子进程使用替换的话并不会影响父进程,因为父子之间有写实拷贝,所以,我们可以利用子进程去跑我们想跑的进程,就像父进程就像函数调用一样。

我们甚至可以在自己的进程里替换成别的进程执行。

这是一个简单的c++程序。

随后我们就在之前的.c文件里创建一个子进程,然后用子进程替换我们的.cc文件。

然后我们就可以看见,它并不受到语言间的差异替换成功了。衍生一下就可以变成,根据上层传过来的数据形式,利用exec系列的接口来接收再使用。

基础IO

概念

首先在Linux环境下,对于文件,广义上的理解就是一切皆文件,而狭义的理解就是文件存放在磁盘里,磁盘是外设,它既是输入也是输出设备,所以对文件的操作就是对磁盘进行输入输出。而文件 = 内容 + 属性 ,所以对文件进行操作无非就是对文件的内容和属性做操作。

那么,谁来进行操作呢,操作系统。 但是操作系统不可能只管理一个文件,而我们也不可能只有一个文件,所以操作系统会为每一个文件创建一个包含该文件信息的结构体,然后利用一个链表来进行统一管理。

读写

在Linux里执行读写的操作其实和C语言一样,都是fopen打开,然后fread读或者fwrite写,最后记得fclose关闭即可。

这样就模拟出了一个cat的效果,可以只要有我们提供的文件名,它自己自动打印文件内容出来。

而根据我们的读写概念来理解,其实打印就是往指定位置输入内容,而这些位置一般又分为三个

:stdin标准输入 键盘文件、stdout标准输出 显示器文件 stderr 标准错误,显示器文件。

在程序启动时会自动打开这三个,所以我们能看到运行的结果或者过程。

以上就是基础IO的概念和以往的用法回顾,但是IO并不只是这样,还能往除了上述三个以外的地方读写,这个就在下一篇进行详解了。

相关文章:

Linux的进程替换以及基础IO

进程替换 上一篇草率的讲完了进程地址空间的组成结构和之间的关系,那么我们接下来了解一下程序的替换。 首先,在进程部分我们提过了,其实文件可以在运行时变成进程,而我们使用的Linux软件其实也是一个进程,所以进一步…...

《计算机网络A》单选题-复习题库

1. 计算机网络最突出的优点是(D) A、存储容量大B、将计算机技术与通信技术相结合C、集中计算D、资源共享 2. RIP 路由协议的最大跳数是(C) A、13B、14C、15D、16 3. 下面哪一个网络层次不属于 TCP/IP 体系模型(D&a…...

闲谭Scala(2)--安装与环境配置

1. 概述 Java开发环境安装,需要两步,第一安装JDK,第二配置环境变量。 Scala的话,也是两步,第一安装Scale环境,第二配置环境变量。 需要注意的是,配置环境变量,主要是想让windows操…...

Python基于卷积神经网络的车牌识别系统开发与实现

1. 简介 车牌识别是人工智能在交通领域的重要应用,广泛用于高速违章检测、停车场管理和智能交通系统等场景。本系统通过基于卷积神经网络(CNN)的深度学习算法,结合 Python 和 MySQL 实现车牌的快速识别与管理。 系统特点&#x…...

Spring Boot集成Netty创建一个TCP服务器,接收16进制数据(自定义解码器和编码器)

Netty Netty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。 在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和worker…...

Python 中的 with open:文件操作的最佳实践

在 Python 中,文件操作是最常用的一项任务,无论是读取文件内容,还是将数据写入文件。传统的文件操作方式使用 open() 和 close() 函数来处理文件,但在实际开发中,我们推荐使用 with open() 语句来进行文件操作。本文将…...

哪些框架、软件、中间件使用了netty? 哪些中间件、软件底层使用了epoll?

使用 Netty 的软件、中间件和框架 Netty 是一个异步事件驱动的网络应用框架,广泛应用于构建高性能的网络应用程序。以下是一些使用了 Netty 的知名软件、中间件和框架: 1. Elasticsearch 描述:Elasticsearch 是一个分布式的搜索和分析引擎…...

AI 智能助手对话系统

一个基于 React 和 Tailwind CSS 构建的现代化 AI 对话系统,提供流畅的用户体验和丰富的交互功能。 项目链接:即将开放… 功能特点 🤖 智能对话:支持与 AI 助手实时对话,流式输出回答📁 文件处理&#xff…...

2024年秋词法分析作业(满分25分)

【问题描述】 请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下: (1)数据结构和与语法分析程序的接口请自行定义;类别码需按下表格…...

Docker镜像瘦身:从1.43G到22.4MB

Docker镜像瘦身:从1.43G到22.4MB 背景1、创建项目2、构建第一个镜像3、修改基础镜像4、多级构建5、使用Nginx背景 在使用 Docker 时,镜像大小至关重要。我们从 create-react-app (https://reactjs.org/docs/create-a-new-react-app.html)获得的样板项目通常都超过 1.43 GB…...

前端加解密对抗encrypt-labs

前言 项目地址:https://github.com/SwagXz/encrypt-labs 作者:SwagXz 现在日子越来越不好过了,无论攻防、企业src还是渗透项目,总能看到大量的存在加密的网站,XZ师傅的前端加密靶场还是很值得做一做的,环…...

Android Notification 问题:Invalid notification (no valid small icon)

问题描述与处理策略 1、问题描述 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.notifications/com.my.notifications.MainActivity}: java.lang.IllegalArgumentException: Invalid notification (no valid small icon): Notification(chan…...

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例,包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息,帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等!【…...

Log4j2的Policies详解、SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy

文章目录 一、Policies二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略2.1、文件达到指定大小就归档 三、TimeBasedTriggeringPolicy:基于时间间隔的滚动策略3.1、验证秒钟归档场景3.2、验证分钟场景3.3、验证小时场景 四、多策略组合使用五、扩展知识5.1、S…...

ES中查询中参数的解析

目录 query中参数match参数match_allmatch:匹配指定参数match_phrase query中其他的参数query_stringprefix前缀查询:wildcard通配符查询:range范围查询:fuzzy 查询: 组合查询bool参数mustmust_notshould条件 其他参数 query中参数 词条查询term:它仅匹配在给定字段…...

学习笔记:使用 pandas 和 Seaborn 绘制柱状图

学习笔记:使用 pandas 和 Seaborn 绘制柱状图 前言 今天在使用 pandas 对数据进行处理并在 Python 中绘制可视化图表时,遇到了一些关于字体设置和 Seaborn 主题覆盖的小问题。这里将学习到的方法和注意事项做个总结,以便之后的项目中可以快…...

【每日学点鸿蒙知识】placement设置top、组件携带自定义参数、主动隐藏输入框、Web设置字体、对话框设置全屏宽

1、popup组件placement设置top没有生效? 可以用offset属性将popup往下边偏移一下 来规避 2、组件携带自定义参数的接口是哪个? 参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attributes-…...

后端开发-Maven

环境说明: windows系统:11版本 idea版本:2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型(POM),通过一组构建规则和约定来管理项目的构建&#xf…...

自动化办公-合并多个excel

在日常的办公自动化工作中,尤其是处理大量数据时,合并多个 Excel 表格是一个常见且繁琐的任务。幸运的是,借助 Python 语言中的强大库,我们可以轻松地自动化这个过程。本文将带你了解如何使用 Python 来合并多个 Excel 表格&#…...

mavlink移植到单片机stm32f103c8t6,实现接收和发送数据

前言: 好久没更新博客了,这两个月真的是异常的忙,白天要忙着公司里的事,晚上还要忙着修改小论文,一点自己的时间都没有了,不过确确实实是学到了很多东西,对无人机的技术研究也更深了一些。不过好…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...