“执行一个新程序”很容易在口头表达中变成“启动一个新进程”。Linux的execve手册专门提醒,这样描述execve会造成误导:它没有创建新进程,而是让现有的调用进程执行另一个程序。[1] 理解这句话,关键在于把正在运行的程序内容,与承载执行的进程身份分别来看。

手册DESCRIPTION开头写道,execve执行指定路径所指的程序,调用进程当前运行的程序因此被新程序替换。与此同时,栈、堆以及已初始化和未初始化的数据段按新程序重新初始化。这里描述了实际变化的内容,所以“还是同一个进程”并不表示原程序的内存内容原样保留,继续执行原来的程序逻辑。

在NOTES中,手册又从另一方向解释:调用进程的许多属性保持不变,特别是PID。于是,同一组描述中可以同时出现“程序已经更换”和“进程号没有更换”。两者并不矛盾,因为它们分别回答执行什么与由哪个进程执行的问题。PID在这里是被明确保留的属性示例,而不是对全部进程属性不变的概括。

可以设想一个仅用于概念说明的时间顺序:某个已有进程原先执行程序甲,成功完成所述替换后执行程序乙。按照手册,不能仅因乙是新程序,就在这个过程里额外画出一个由execve创建的第二进程;也不能因PID沿用,就把乙画成甲原有数据的继续。这个假设没有调用系统接口或观察真实机器,只帮助阅读手册中的对象关系。

对操作系统技术文档,这一区分影响过程图怎样画、日志说明怎样写。一个图框标识进程身份,框内标识当前程序,两项可以在同一张图上分别表达。若文字只写“新进程执行乙”,读者会自然理解为出现了新的进程身份,恰好遗漏了手册重点澄清的既有进程关系。准确使用“程序替换”,可以保留这项机制的特征。

本文采用Linux man-pages 6.19中execve条目的开头定义与NOTES第一段,只讨论成功替换时的程序和进程身份。条目的日期与网页生成时间不被写成首次发布日期。手册另外列出属性变化、失败情形和权限等内容,本篇不据简化模型解释那些问题,也不提供执行命令或生产系统处理建议。对这里的问题,程序改变与PID保留已经构成完整而清楚的答案。

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。