exec的不同实现--鸠占鹊巢还是功成身退

手把手教你用ADS仿真FMMT417雪崩三极管,搞定射频脉冲源设计 本文详细介绍了如何使用ADS仿真工具设计基于FMMT417雪崩三极管的射频脉冲源。从器件选型、SPICE模型导入到电路设计与优化,提供了一套完整的实操方案,特别适合射频脉冲设计的初学者。通过级联设计和实测验证,帮助工程师快速掌握雪崩电路的应用技巧,提升射频脉冲源的设计效率。 阅读详情

exec 函数可以执行一个进程,是 Run-Time Library 里面的特性,标准上并没有给出什么硬性规定,因此各个操作系统平台上就可以有五花八门的实现了,本文介绍 linux 上的实现鸠占鹊巢和 windows 下的实现功成身退。

     在 linux 上,著名的 exec 函数族可谓是无人不晓,它最著名的特性就是可以实现替换当前进程的地址空间,因此你如果在一个进程当中执行了 exec ,那 就不要指望 exec 返回执行 exec 调用点后面的操作了。 exec 并不负责创建进程,他只负责替换地址空间,负责创建进程的是由另一个系统调用来承担,就 是 fork ,所以在 linux 中典型的创建新的执行映像的方式就是 fork+exec ,当然在你不想要当前进程的情况下也可以直接 exec 。而在 windows 下, exec 却是简单的 CreateProcess+ExitProcess 的封装,在 windows 下一切最终都要落实到 win32API 的,因此 Win32API 相当于多出来的一个层次,而不像 linux 直接进行系统调用完事,从这二者的实现我们可以看出什么端倪吗?
    
凡是用过 unix 的都知道 unix 的哲学,每次只做并且做好一件事情这个终极哲学,你看 fork ,连参数都没有,就是创建进程,再看 exec ,根本不管进 程的事,就是替换地址空间,只有这样,把如何组合的策略交给用户,用户才可以获得最大的自由,从而开发出丰富的应用程序。 linux 本身是一点策略都不提 供的,它不会帮你做你认为会省力的工作,也就是说,只要是你可以完成的工作它就绝对不插手,比如在不影响当前进程的情况下启动另一个进程, linux 认为 没有必要直接提供这样一个系统调用,这里的用户指的是所有系统调用层上面的用户,包括库的设计者。库的设计者或者程序员用户可以随意组合这些现有的系统调 用接口,封装成更加方便的接口,只可惜操作系统并不会帮你,举个例子, fork+exec 就有一个封装函数,叫做 system 。我们反过来看看 windows 的策略, windows 为了开发者可以最快的进行开发,另外加上它的内核和用户空间是比较同步的进行开发的,联系非常紧密,两个空间非常的 了解对方,因此 windows 往往会直接提供一些策略,这就增加了操作系统和开发者之间的耦合度,不像在 linux 下开发,系统调用接口很稳定,一般不怎 么变化,内核空间和用户空间只需要通过这个稳定的接口层通信就可以了,而且彼此完全可以不了解对方,正如我前一篇文章所说,这种特性带来的就是术业有专攻
的 庞大社区的支持,力量非常强大。既然 windows 提供了一些用户策略,那么它就明显不适合 unix 哲学同样是创建进程 windows 的 CreateProcess 函数几乎为用户做完了全部的事情,包括创建进程,映射程序映像,这就是和 linux 的最大不同了。当然并不能说 windows 不好,它也有自己的哲学,作为一个产品,它的开发者深知自己的产品,另外不管是内核还是用户空间策略都是产品的一部分,因此就没有必要区分那么清了,它的 开发者通过会议的方式进行协作,因此他们之间的通信就不一定要局限在系统调用接口了。
    
可能有些人会认为 windows 的 exec 的方式更加干净,确实有那么一点意思, linux 的方式有些罗嗦也有那么一点意思,可是用户真的需要这种所谓的 干净吗?那要看用户是什么样的人了,信奉不同哲学的人往往会因为一点小的分歧大开杀戒。事实上 linux 的 exec 和 windows 的 exec 根本就不是 一个层面上的,在 linux 中, exec 只是 “ 创建进程 ” 这件事情的 “ 一部分 ” ,而在 windows 下, exec 却包含了 “ 创建进程 ” 这件事情,但是还不 止这件事情,另外还包括 “ 退出当前进程 ” 这件事情,用一句俗语区分它们就是,在 linux 中, exec 的作用是 “ 鸠占鹊巢 ” ,在 windows 中, exec 的作用一个是 “ 功成 ” 另一个是 “ 身退 ” 。这里就可以看出 linux 和 windows 的设计粒度,显然 linux 更加细化一些,细化的东西组合 起来往往会出现规模效应,功能会很强大,而粗化的东西在扩展的时候功能会受到限制,比如 linux 可以很简单的实现 “ 功成 ”+“ 身退 ” ,就是 fork+exec+exit ,其实就是三个只做一件事的系统调用之组合,反过来要在 windows 下实现 “ 鸠占鹊巢 ” 就不容易了,因此 windows 中 最细的东西都要比这个 “ 鸠占鹊巢 ” 要粗,于是就受到了限制。这样的话,在 linux 中就可以在保持 pid 不变的情况下重新启动自身,而在 windows 下 这个需求就很难了。
    
虽然同样都是 exec 函数,在 linux 和 windows 中的地位却大不相同,当然其位置也不同,在 linux 中可以很安心的将之放到系统调用门口,因为 它就做一件事,不会有任何副作用,但是在 windows 下,它的存在纯粹是为了兼容标准 C ,于是就要用 Win32API 来封装 exec 函数,而 Win32API 中却没有替换地址空间这么细粒度的操作,于是乎只好仅仅实现语义,于是最终就有了 CreateProcess+ExitProcess 的 组合,有人可能会问这不也是一个组合吗?是的,这是一个组合,但是这是由只做一件事的函数作为元素组合的吗?显然不是。

 

部署与可视化系统:零基础到精通:LabVIEW 调用 YOLO 动态链接库(DLL)的保姆级视觉检测系统融合实战 LabVIEW与YOLO26深度集成:工业视觉检测新范式 本文揭示了LabVIEW与最新YOLO26模型深度集成的创新方案,通过C++封装ONNX Runtime为DLL,在LabVIEW中实现端到端视觉检测。核心突破点包括: 技术选型:对比YOLOv5/YOLOv8/YOLO26性能,YOLO26在CPU推理速度提升43%,支持NMS-Free端到端推理 部署架构:提供ONNX Runtime C++ API和TensorRT两种DLL封装路径,适配不同硬件环境 工程实现:详细展示从PyTorch模型导出 阅读详情

相关推荐

用Python玩转LQR控制:3行核心代码实现倒立摆稳定控制(附Jupyter Notebook)

本文通过Python实战演示了如何使用LQR算法实现倒立摆的稳定控制。文章以直观方式解释LQR原理,提供从系统建模、核心代码求解到参数调优的完整流程,并附有可运行的Jupyter Notebook代码。重点介绍了如何利用SciPy库快速计算最优反馈增益,并通过仿真验证控制效果,为运动控制实践提供了即学即用的指南。

weixin_29311017的博客 83

exec函数实现

SYSCALL_DEFINE3(execve,   const char __user *, filename,   const char __user *const __user *, argv,   const char __user *const __user *, envp) {  return do_execve(getname(filename), argv, envp);

星空探索 901

Zynq工程IP核封装:XCI引用与约束继承实战指南

IP核封装是FPGA系统设计中实现模块复用、团队协作与技术资产沉淀的关键环节。其本质是将功能逻辑、时序约束、接口协议和硬件配置统一抽象为可配置、可验证、可演进的标准化组件。核心原理在于通过XCI文件保留IP核的参数化定义能力,依托Vivado IP Packager实现约束继承、端口自动映射与时钟域解耦,从而保障跨项目集成的时序可信性与约束完备性。该技术广泛应用于Zynq SoC视频处理、高速接口(如HDMI/TMDS)、多时钟域控制系统等场景,尤其在需要长期维护与版本迭代的工业级嵌入式开发中具有不可替代的

weixin_42593701的博客 122

可执行程序的加载过程暨exec函数的实现

文章目录fork前言exec族函数ELF可执行文件格式struct linux_bin_prm结构描述一个可执行程序execve加载可执行程序的过程 fork前言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。 我们都知道for

二进制君 1357

kali2020.2安装出现的问题并附详细解决办法

kali2020.2的安装

weixin_48776804的博客 3048

AnolisOS网卡驱动源码编译与安装实战指南

本文提供了一份详尽的AnolisOS网卡驱动源码编译与安装实战指南。针对系统自带通用驱动不兼容导致网络无法使用的问题,文章从环境准备、源码获取、编译安装到新旧驱动替换与持久化配置,一步步解析了如何通过源码编译安装官方驱动,解决硬件兼容性问题,并确保驱动在系统重启后自动生效。

weixin_28358083的博客 304

linux进程编程之exec族函数

Linux进程通信之exec族

m0_70987863的博客 1890

FastAPI + Layui:打造企业级敏捷开发后台管理系统

本文详细介绍了如何使用FastAPI和Layui构建高效的企业级后台管理系统。FastAPI提供高性能的异步API支持,而Layui则简化了前端开发流程,两者结合可实现快速开发和部署。文章涵盖了从环境搭建、核心组件开发到性能优化的全流程,特别适合需要敏捷开发的企业项目。

weixin_29045585的博客 555

Linux系统编程之exec函数簇的使用:剖析exec函数簇的实现原理、参数解释和用法技巧

linux exec函数簇

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1375

audio框架学习-Audio_Flinger分析

文章目录一、代码位置二、audio服务启动2.1 main服务2.2 audioflinger添加到系统服务中2.3 audioflinger的对外接口 之前记录过audioTrack的笔记,这次继续参考audioFlinger相关的代码并做笔记; 参考文档:https://www.cnblogs.com/innost/archive/2011/01/15/1936425.html和https://blog.youkuaiyun.com/zyuanyun/article/details/60890534?spm=100

永不秃头的程序员的博客 2135

华为OD机试真题 新系统2026-04-15 Python&JS 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 523

exec

exec 在linux的bash shell中,执行外部命令时,该shell会fork一个子进程,这个子进程调用exec从磁盘上加载外部命令对应的程序。这是exec的一个应用。通过它的应用来看原理 exec会把一个可执行文件的绝对路径作为参数,把当前正在运行的用户进程的进程体用该可执行文件的进程体替换,从而实现新进程的执行,而进程的pid是不变的。可以这样认为,exec并没有创建新的进程,只是...

cw312644167的博客 1929

23、电生理与CSD分析:探索大脑活动的前沿技术

本文介绍了电生理与电流源密度(CSD)分析在探索大脑活动中的前沿应用。从电生理技术的发展现状,到局部场电位(LFPs)的起源与解释,重点阐述了CSD分析的原理、实验方法及其在绘制皮层兴奋流、解析突触输入和研究自发振荡中的广泛应用。文章还总结了该领域的优势与挑战,并展望了技术改进、多模态融合、数据分析创新及临床拓展的未来方向,展示了这些技术在揭示大脑功能机制中的关键作用。

Apple的专栏 119

exec函数

(1)exec函数说明fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、

guoping16的专栏 3万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

exec系列函数的实现

exec系列函数从linux的linux_binfmt链表中,通过依次调用每个结构的load_binary函数来选择合适的运行格式,一旦找到就执行load_binary函数,否则尝试下一个linux_binfmt的load_binary,直到尝试完所有的linux_binfmt。load_binary函数:1.检查128位的magic number,看文件是不是属于这个格式2.读取文件的heade

dodobear的小窝窝 931

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Minix中exec的实现

参照《操作系统:设计与实现》。文章中大部分文字和图片来源于此书。书籍中以在shell命令端输入命令创建进程为例来讲解EXEC系统调用。它完成的工作如下:1.检查权限---文件是否可执行?2.读取文件头得到各段长度和总长度。3.从调用者处取参数和环境。4.分配新内存和释放旧内存。5.把堆栈复制到新的内存映像中。6.把数据(可能还有正文段)段复制到新的内存映像中。7.检查处理setuid、setgid位。8.设置进程表项。9.告诉内核进程现在是可运行的。例:在shell终端输入如下命令。ls -l f.cg.c

xiaojialin的专栏 1069

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 166

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 670

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 370

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 268

向 excel、word、pdf 三种文档中占位符插入数据

【代码】向 excel、word、pdf 三种文档中占位符插入数据。

weixin_45934659的博客 49

C++ STL 反向迭代器:从源码框架到适配器实现

在 C++ STL 中,反向迭代器(reverse_iterator)是一个很典型的设计案例:它本身并不直接持有容器数据,而是通过封装一个正向迭代器,把「前进」变成「后退」,从而让同一个容器既能正序遍历,也能逆序遍历。本文从 SGI-STL 3.0 的源码框架出发,梳理反向迭代器的设计思路,再手写一个通用的迭代器适配器,并在vector和list中完成适配与测试。在 SGI-STL 3.0 中,反向迭代器的核心源码位于。反向迭代器是一个适配器,各个容器再基于它适配出自己的反向迭代器类型。下面截取list。

Godbro的博客 229

软件商店常见问题标准处理流程

从底层软件源来看,/etc/apt/sources.list配置错误、源地址失效、公网与内网离线源混用、ARM64与x86_64架构源串用,以及DNS解析异常、系统代理配置错误,都会导致商店无法获取应用数据;打开该应用,确认可正常运行;软件商店作为系统内置的图形化软件分发与安装入口(UKUI桌面配套组件,底层依赖APT软件源),承担着应用软件的浏览、搜索、下载、安装、升级与卸载等核心功能,是终端软件部署与管理的关键通道。覆盖软件商店启动、页面加载、应用下载、安装、卸载、搜索、自身更新等全部业务场景。

qq_39496637的博客 267
上一篇: 一个并发或者称为锁的问题
下一篇: 关于应用程序的重启
linuxcode_turing
博客等级 码龄17年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值