LSD第四章进程
lsd字母标记法-概述说明以及解释

lsd字母标记法-概述说明以及解释1.引言1.1 概述:LSD字母标记法是一种用于标记事物或概念的简单而直观的方法。
通过使用字母L、S和D来表示不同的属性或特征,可以快速而准确地描述和理解各种内容。
这种标记法可以应用于各种领域,例如教育、商业、科学等,帮助人们更好地组织和理解复杂的信息。
本文将介绍LSD字母标记法的定义、优势和应用领域,旨在帮助读者了解并应用这一简单而有效的标记方法。
通过深入探讨LSD字母标记法的潜力和未来发展方向,可以更好地发挥其作用,提高工作效率和理解能力。
愿本文能为读者带来启发和帮助,使他们在实践中更好地应用和创新LSD 字母标记法。
1.2 文章结构文章结构部分的内容可以包括以下内容:在本文中,将会探讨LSD字母标记法的定义、优势以及应用领域。
首先,我们将介绍什么是LSD字母标记法,包括其基本概念、历史背景和特点。
接着,我们将深入分析LSD字母标记法相比于其他标记法的优势所在,包括在数据可读性、操作效率和编码规范性方面的优势。
最后,我们将探讨LSD字母标记法在不同领域的应用情况,包括软件开发、数据处理和实验设计等方面。
通过对这些内容的深入讨论,读者将更全面地了解LSD字母标记法的重要性,并能够更好地应用于实际工作中。
1.3 目的LSD字母标记法作为一种新型的标记方式,其设计初衷是为了简化信息处理和管理过程,提高工作效率和准确性。
通过使用字母代表不同的状态或属性,可以更直观地呈现数据,并且减少混淆和错误的可能性。
本文的目的在于介绍和探讨LSD字母标记法的特点、优势以及应用领域,希望能够帮助读者更好地理解和应用这种标记方式,提高工作效率和准确性。
同时,也旨在引起更多人对字母标记法及其未来发展的关注和探讨,促进相关领域的进步和发展。
2.正文2.1 什么是LSD字母标记法LSD字母标记法是一种用字母来标记和编码目标或任务的方法。
这种方法最初由管理学家和顾问约瑟夫·雅各布斯提出,并在业界得到广泛应用。
Linux命令高级技巧使用fuser和lsof查找文件被哪些进程使用

Linux命令高级技巧使用fuser和lsof查找文件被哪些进程使用在Linux系统中,有时候我们需要查找某个文件正在被哪些进程使用,以便于进行相关的操作。
这时候,我们可以使用fuser和lsof这两个高级命令来帮助我们完成这个任务。
本文将详细介绍如何使用fuser 和lsof命令来查找文件被哪些进程使用的高级技巧。
一、使用fuser命令查找文件被哪些进程使用fuser命令用于查找文件或者目录被哪些进程使用。
下面是fuser命令的基本用法:```shellfuser [-cEvkfuoMmv] 文件或目录名```选项说明:- -c:使用统计结果格式输出;- -E:输出指定文件系统上的进程;- -v:输出详细信息;- -k:杀死使用该文件的进程;- -f:在显示进程ID前显示进程可执行文件的完整路径;- -u:显示使用文件的用户名;- -o:列出使用文件的进程所有者的用户名;- -M:显示以分钟为单位的进程使用文件的时间;- -m:查看指定文件或目录的socket信息;- -v:输出详细信息。
下面是一些使用fuser命令的例子:1. 查找特定文件被哪些进程使用:```shellfuser /path/to/file```2. 列出文件的进程ID、进程所属用户和进程的完整路径:```shellfuser -fu /path/to/file```3. 列出文件的进程ID、进程所属用户、进程的完整路径和进程使用该文件的时间:```shellfuser -fM /path/to/file```二、使用lsof命令查找文件被哪些进程使用lsof命令也可用于查找文件被哪些进程使用。
下面是lsof命令的基本用法:```shelllsof [ -a ] [ -b ] [ -c c ] [ -d dl ] [ -d2dỉ ] [ -e s ] [ -F [l"[|[X1"] ]] [ -g [vg ] ] [ -i [i] ] [ -k k ] [ appearing ] [ -Ln ] [ -n ] [ -o ] [ -ſ ] [ -p s ] [ -R [t ] ] [ -s [N [ a"ée ] ]] [ -t [c ] ] [ -u ] [ -w ] [ -x s ]```选项说明:- -a:筛选满足所有条件的进程;- -b:列出打开了二进制文件的进程;- -c c:列出命令为c的进程;- -d dl:列出设备为dl的进程;- -d2dỉ:列出目录为dỉ的进程;- -e s:用“=”或“>”表示指定选项,匹配的模式以“=”开始,排除的模式以“>”开始;- -F [l"[|[X1"] ]:定义自定义输出格式;- -g [vg ]:列出了指定的进程ID或者进程组ID;- -i [i]:列出满足指定条件的网络连接,第一个i表示筛选输入连接,第二个i表示筛选输出连接;- -k k:用正则表达式表示,匹配准确描述的输出行;- -L:列出实际符号链接而不是其被链接的文件;- -n:禁用解析网卡符号链接的转换;- -o:禁用open文件描述符符号链接;- -p s:列出指定的进程ID;- -R [t ]:列出指定rsh用户的进程;- -s [N [ a"ée ] ]:列出特定网络协议状态,N表示筛选特定的网络协议状态;- -t [c ]:列出使用了TTY的进程;- -u:列出指定用户的进程;- -w:匹配指定的文件描述符;- -x s:列出满足命令行的进程。
lsd方法的具体步骤

lsd方法的具体步骤LSD方法的具体步骤LSD(Least Significant Difference)方法是一种常用的多重比较方法,用于在实验数据分析中进行多个处理间的比较。
下面将详细介绍LSD方法的具体步骤。
一、确定实验设计和收集数据在进行LSD方法之前,首先需要确定实验设计,并根据设计进行实验数据的收集。
实验设计通常包括独立变量和因变量的确定,以及不同处理条件的设置。
收集到的数据应包含每个处理条件下的样本观测值。
二、计算平均数和标准差在进行LSD方法之前,需要计算每个处理条件下的样本平均数和标准差。
平均数反映了样本数据的集中趋势,标准差反映了数据的离散程度。
这些统计量的计算可以通过计算机软件或统计软件来完成。
三、计算LSD值LSD值是LSD方法的核心计算部分。
它用于确定两个处理条件之间的差异是否显著。
计算LSD值的公式如下:LSD = t * (SE)其中,t是t分布的临界值,通常为α水平下的临界值,SE是标准误差,可以通过下述公式计算:SE = (2 * MSerror / n)^0.5其中,MSerror是误差平方和除以误差自由度,n是每个处理条件下的样本数量。
四、进行多重比较在计算得到LSD值后,可以进行多重比较。
多重比较是指对所有处理条件进行两两比较,以确定它们之间是否存在显著差异。
比较的方法是将处理条件的差异与LSD值进行比较,若差异大于LSD值,则认为两个处理条件之间存在显著差异。
五、进行统计显著性检验在进行多重比较后,需要进行统计显著性检验,以确定处理条件之间的差异是否显著。
常用的检验方法包括t检验和方差分析。
通过显著性检验,可以判断处理条件之间的差异是否是由于随机因素引起的。
六、结果解释和数据报告根据LSD方法的结果,进行结果解释和数据报告。
结果解释应结合实际情况,对处理条件之间的差异进行解释和分析。
数据报告应包含每个处理条件下的样本平均数、标准差、LSD值以及多重比较的结果。
kswapd原理

kswapd原理Kswapd是一种内核线程,它的主要任务是尝试回收被进程使用的内存,将其交换到磁盘上,以便系统中的总内存使用率得以控制。
在Linux系统中,如果内存使用率过高,系统可能会出现卡顿、延迟和崩溃等问题,而kswapd 线程则是解决这些问题的关键。
一、Linux系统的虚拟内存管理机制在Linux系统中,所有的进程都运行在独立的内存空间中,每个进程分配的内存大小是有限的。
当进程申请内存超出其分配的空间时,就会发生内存溢出,系统将其自动终止。
为了避免内存溢出,Linux系统引入了虚拟内存的概念。
虚拟内存是指将物理内存和磁盘空间结合起来使用,将进程所需的数据和代码保存在物理内存和磁盘空间中,实现内存扩展。
Linux系统中,虚拟内存管理机制主要由以下几个部分组成:1、页表:每个进程都拥有独立的页表,用于记录虚拟地址和物理地址之间的映射关系。
2、页面置换算法:Linux系统中采用了一系列的页面置换算法,主要包括最少使用算法(LRU)、时钟算法、快速淘汰算法等,用于实现页面的实际置换。
3、内存回收机制:Linux系统中还配备了一些内存回收机制,例如kswapd线程,用于回收闲置的物理内存,将其交换到磁盘上,以便更好地管理内存空间。
二、kswapd线程的工作原理在Linux系统中,kswapd线程主要负责回收闲置的物理内存,将其交换到磁盘上,并将这些空闲物理内存缓存起来,以供后续进程使用。
kswapd线程的工作原理可分为以下几个步骤:1、检查内存使用率kswapd线程会周期性地检查系统中的内存使用率,如果发现内存使用率过高,则会进入下一步操作。
2、选择可回收的物理内存kswapd线程会逐一检查系统中的物理内存,找到最适合回收的物理内存块。
通常情况下,kswapd线程会优先回收已经被缓存的物理内存块,这些内存块曾经被使用过,但目前已经闲置。
3、将物理内存交换到磁盘上一旦kswapd线程找到可回收的物理内存块,就会将其交换到磁盘上,释放出物理内存的空间,以便后续进程使用。
ios7手动进程优化,进程详细解释

我在后面输入:‘绝对不可以删除’和‘不可以删除’的一定不要删除,这些是涉及到系统主要运行文件的进程,删除会造成白苹果或无法开机,绝对不可以删除只是将危险文件特别强调一下,以免大家看错误删。
‘不建议删除’的是可以删,大家更具自己喜好决定,但我不敢保证将来不会出问题,但是我敢保证不会白苹果或无法开机。
‘可以删除’的是绝对可以安全删除的。
路径:System/Library/LaunchDaemons199进程解析列表:(处于方便考虑,将其中198个文件全部按照字母表排列,避免了苦苦对比寻找进程的麻烦,您只需要从第一个对照到最后一个!就是这么简单)不用记住我的名字我是———— FredericshiheGO!.apple.ABDatabaseDoctor.plist - 通讯录数据库诊断不建议删除.apple.absd.plist -与设备性能相关启动项不可删除.apple.accountsd.plist -添加邮件帐户启动项,删除可能会造成卡顿或无法开机绝对不可以删除.apple.adid.plist -会导致appstore无法安装应用不建议删除.apple.afcd.plist -这个不用解释了,删除无法进入查看系统文件不可以删除.apple.aggregated.addaily.plist - 连接iTunes后显示本机号码可以删除.apple.aggregated.plist -支持音频输入的关键进程启动项不建议删除.apple.ait.aitd.plist -未知启动项不建议删除.apple.AOSNotification.plist - 以前是同步mbileme的,现在貌似和icloud有关,但平时不运行,不占内存不建议删除.apple.appsupport.cplogd.plist - 记录应用程序和第三方程序崩溃日志可以删除.apple.apsd.plist -设备的推送服务启动项绝对不可以删除.apple.aslmanager.plist - 管理系统日志文件可以删除.apple.assetsd.plist -用于访问照片或视频的位置信息不可以删除.apple.assistant.analyzer.plist -以下为与siri和语音控制的进程可以删除.apple.assistant_service.plist.apple.assistantd.plist.apple.assistivetouchd.plist - 辅助功能里的assistivetouch 可以删除.apple.atc.atwakeup.plist -以下为与连接itunes同步与备份服务相关,删除会造成白苹果不可以删除.apple.atc.plist.apple.awdd.plist -日志诊断可以删除.apple.backboardd.plist -后台推送进程删除灰白苹果绝对不可以删除.apple.backupd.plist - itunes和icloud备份进程不可以删除.apple.BlueTool.plist - 以下为蓝牙服务相关进程不建议删除,删除反而会引起耗电增加.apple.BTServer.avrcp.plist.apple.BTServer.le.plist.apple.BTServer.map.plist.apple.BTServer.plist.apple.calaccessd.plist -添加日历事件不建议删除.apple.certui.relay.plist - 当你在一个公共网络,safari无法校验一个网站时,会提示这个网站未经过验证,是否继续。
iPad内存优化

要关闭一个进程只要把LaunchDaemon下相应的文件删除就行,下面介绍那些文件是可以删除,那些是不能删除的
可以安全删除的进程
com.apple.dataaccess.dataaccessd.plist - 删除这个将不能同步联系人
com.apple.datamigrator.plist - 把sim卡上的联系信息存到ipad,iphone上的
com.apple.racoon.plist - VPN进程,删了后不能使用VPN
com.apple.DumpPanic.plist - 储存系统崩溃信息
com.apple.ReportCrash.(不同的名字).plist - 有6个这样的文件,他们的任务是收集是什么原因造成系统崩溃的,比如什么软件在运行,什么时间。。等等
com.apple.DumpBasebandCrash.plist - 储存基带崩溃信息 (ipod touch没有这个文件,不知道wifi版的ipad有没有这个文件)
iPad进程
在你的iPhone或者iPod开机时, 会启动一系列后台进程, 在3.0版中确切说有54个后台进程. 如果能较好地管理这些进程, 则你的iPhone或iPod会运行的更好一些. 下面大致介绍一下如何管理这些进程.
在管理这些进程之前, 你的iPhone或iPod中最好安装了iFile, 这是一个非常好的系统文件管理软件. 或者装了OpenSSH, 以便能用电脑通过SSH连接你的iPhone或iPod.
服务名 用途 进程名
2023年专升本考试大纲 《预防医学》考试要求

《预防医学》考试要求I、考试性质为挑选专科生中优秀的学生进入普通高等学校专升本学生,特举办此考试。
该考试所包含的内容将大致稳定,试题形式多种,具有对学生把握课程的较强识别、区分能力。
II、考试内容及要求第一篇流行病学第一章绪论掌握流行病学定义及流行病学定义的诠释,流行病学的应用。
熟悉流行病学的原理。
了解流行病学发展史,流行病学的特点,流行病学与其他学科的关系,流行病学的展望。
第二章疾病的分布掌握疾病分布的概念。
熟悉疾病频率测量指标,描述疾病流行强度的常用术语。
了解疾病人群分布、地区分布和时间分布的特征与变化规律。
第三章描述性研究掌握描述性研究的概念、种类、用途;现况研究的概念及特点;普查、抽样调查的概念、用途。
熟悉生态学研究、个案调查、病例报告、病例分析的概念、用途;现况调查实施步骤、数据分析、常见偏倚及控制方法。
了解调查表的编制;生态学研究的方法和局限性。
第四章队列研究掌握队列研究的定义、基本原理和方法,队列研究的设计与资料整理分析,包括累计发病率、发病密度、相对危险度、归因危险度及人群归因危险度等指标的计算方法及其流行病学意义。
熟悉队列研究的特点、研究类型;队列研究的偏倚及其控制方法;队列研究的优缺点。
了解队列研究的实施步骤、样本大小的估计、随访方法、人年的计算、率的显著性检验。
第五章病例对照研究掌握病例对照研究的基本原理;匹配的原理和方法;病例与对照的来源与选择;资料整理和数据分析的基本方法;OR的含义及其在病例对照研究中的意义;。
熟悉病例对照研究的一般步骤;分层分析的概念及应用,病例对照研究中常见的偏倚及其控制方法;病例对照研究的优点及局限性。
了解实施病例对照研究应注意的问题。
第六章实验流行病学掌握实验流行病学的定义、基本特点、流行病学实验的类型:临床试验、现场试验、社区试验。
熟悉实验流行病学研究与队列研究优缺点的比较。
了解实验流行病学研究优缺点和应注意的问题。
第七章筛检掌握筛检的定义、评价筛检试验真实性的指标的计算及意义。
kswapd原理

kswapd原理
kswapd是Linux内核中的一个守护进程,它的主要任务是在系
统内存不足时,将一些长时间未被使用的页面数据从内存中交换到磁盘上,以释放出物理内存以供其他程序使用。
kswapd的核心原理是
基于Linux内核内存管理机制中的页面置换算法。
在Linux内核中,每个进程所占用的内存都被分成许多个页面,每个页面的大小通常为4KB或者8KB。
当系统内存不足时,kswapd会按照一定的规则来选择哪些页面需要被交换出去,比如选择一些长时间未被使用的页面数据。
这些页面数据会被写入磁盘上的交换分区中,以便在后续需要时再次被加载到内存中。
kswapd的执行方式是周期性的,每隔一定的时间就会被触发一次。
在执行过程中,它会扫描系统中的所有进程,检查它们的内存使用情况,并对一些空闲的内存页面进行回收和释放。
kswapd的执行
频率和内存回收的策略可以通过系统内核参数进行配置。
需要注意的是,由于页面置换是一个耗时的操作,如果频繁地进行页面交换会导致系统的性能下降。
因此,在实际应用中需要根据系统的实际情况和需求来选择适当的kswapd执行频率和内存回收策略,以平衡系统的内存利用率和性能。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LSD第四章:进程作者:下家山进程是正在运行的程序!一:实例解析1.1 Win7是如何管理进程的?1.2 linux中是如何查看任务管理器的PS命令【Ps命令及参数解释参考《ps命令解析》】1.3 看看自己写的程序在进程中是如何表现的既然进程是正在运行的程序,我们就来写两个程序,看运行它和不运行它,一个用户运行它和两个用户运行它有什么区别!1.3.1 代码1.3.2 编译1.3.3 一个用户运行两个进程思考,为什么不是一个一个即时显示字符,而是一块一块显示?查看进程1.3.4 一个用户同时运行一个程序的情况1.3.5 两个用户运行结果1.4 总结:1.4.1 linux上进程状态:【进程状态参考《进程状态模型.doc》】结合,裸板中的硬件中断来讲!1.4.2 进程的结构PID:每个进程都被分配一个唯一的数字编号,我们称为进程标识符【PID】。
PID的取值范围【2~32768】,当进程被启动时,系统将按顺序选择下一个未被使用的数字作为它的PID。
当数字已经回绕一圈时,新的PID重新从2开始。
【当我们在一个用户运行两个进程process1和process2的时候,看到系统连续分配的PID是4188和4189】操作系统通过PID对进程进行管理,PID是进程表的索引。
进程运行的代码可以共享:我们在【1.3.4】实验『一个用户同时运行同一个程序』时,我们看到有两个进程,但是我们的代码只有一份,这说明不管有多少个进程在运行某个程序,该程序是被共享的。
函数库(系统和标准)也可以被进程共享:我们在process1.c中(process2.c同理)调用了printf函数,该函数是C语言的函数库,属于系统函数库,printf可以被所有进程同时调用。
这样节省了磁盘空间!进程所使用的变量独立存在【不能共享】:这个实验代码,不足以证明这个问题。
我进行一下修改:这个程序运行时,打印的字符是我们运行前传进去的,并且保存在变量【ch = argv[1][0];】中。
如果,有两个进程运行这个程序,那么,ch的值肯定不一样,这个例子有力的说明了进程中的变量是独立存在于每一个进程中。
进程所使用的堆栈独立存在【不能共享】:我们把上面的程序改一下:这个程序,当被某个进程运行时,传进去的参数,没有通过变量中转,直接使用,【参数是放在栈里面的】,如果有几个进程同时运行这个程序,那么每个进程所使用的堆栈是独立存在的,不是共享的。
【exit和return的区别参考《return和exit的区别》】进程表:1)进程表就像一个数据结构,它把当前加载在内存中的所有进程的有关信息保存在一个表中;2)其中包括:进程的PID,进程的状态,命令字符串和其他一些PS命令输出的各类信息。
3)进程表的长度是有限制的,所以系统能够支持的同时运行的进程数也是有限制的。
早期的UNIX系统只能同时运行256个进程。
最新的实现版本已经大幅降低了这一限制,可以同时运行的进程数只与建立进程表的内存容量有关,而没有具体的数量限制。
【Ps执行结果就是从进程表中找到相关信息显示出来的。
】二:子进程,父进程,进程调度理解亲缘关系2.1 子进程:一般而言,每个进程都是由另一个我们称之为父进程的进程启动的,被父进程启动的进程叫做子进程。
我们从ps -ef命令打印信息里面可以看到,PID是当前进程的进程ID,而PPID是当前进程的父进程ID。
2.2 init进程我们知道,PID的取值范围是从2~32768,当我们执行ps -ef命令的时候,我们有没有发现还有一个PID为1的进程?什么是init进程呢?Linux系统启动时,它将运行一个名为init的进程,该进程是系统运行的第一个进程,它的进程号为1。
你可以把init进程看作是整个系统的进程管理器,是所有进程的祖先进程。
我们所看到的所有进程,要么是init进程启动的,不么是被init进程启动的其他进程启动的。
2.3 父进程【0】在Linux操作系统中,父进程也用PPID来进行管理。
我们在用ps -ef命令时,发现有PPID为的0父进程。
这又是怎么回事呢?Ps的另一种命令格式2.4 进程调度当我们执行命令ps ax时看到如下结果这里,2760号进程处于睡眠(等待,或阻塞)状态。
2867处于运行状态。
2.4.1 分时调度在单处理器系统中,同一个时间只有一个进程在运行,其他进程处于等待状态。
每个进程轮到的运行时间是非常短的(我们称之为时间片)是相当短暂的,这就给人一种多个程序在同时运行的假像。
2.4.2 时间片2.4.3 调度器Linux内核用进程调度器来决定下一个时间片应该分配给哪个进程。
它的判断依据是进程的优先级(优先级1比优先级2的级别要高)。
优先级高的进程运行得更为频繁。
进程的运行时间不可能超过分配给他们的时间片,它们采用的是抢先式多任务处理,所以进程的挂起和继续运行无需彼此之间的协作。
2.4.4 nice程序在一个如linux这样的多任务系统中,多个程序可能会竞争使用同一资源。
在这种情况下,执行短期的突发性工作并暂停运行来等待输入的程序,要比持续占用处理器来进行计算或不断轮询系统来查看是否有新的输入到达的程序要好。
我们称表现良好的程序为nice程序,操作系统根据nice值来决定它的优先级,一个进程的nice值为0,并根据这个程序的表现不断变化。
长期不间断运行的优先级一般会比较低。
例如:暂停来等待输入的程序会得到奖励。
这可以帮助与用户进行交互的程序保存及时的响应性。
在程序等待用户输入时,系统会增加它的nice值,使用renice命令调整它的值。
Nice命令是将进程的nice值增加10,从而降低该进程的优先级。
三,进程编程3.1 启动新进程【system】3.1.1 system执行shell命令我们可以用system函数来编写一个程序,让它替我们来运行ps命令。
System(“ps -o pid,ppid,command”)相当于$sh -c ps -o pid,ppid,command我们这里命令./system1的PID是5255,它的父进程是4649,因为进程system1是由-bash进程启动的,即我们通过在shell提示符下输入./system1回车实现的。
而sh -c ps -o pid,ppid,command这个命令的PID是5256,它的父进程是5255,即由system1来启动的;而命令ps -o pid,ppid,command这个命令的PID是5257,它由sh -c ps -o pid,ppid,command 启动的,所以它的父进程ID是52563.1.2 system执行用户命令上面system运行的是shell命令(系统命令),我们可以运行用户自己的命令吗?3.1.3 system执行后台命令因为system函数用一个shell来启动想要执行的程序,所以可以把这个程序发到后台执行。
具体做法如下:实例解析:在第一个例子中,程序以ps -o pid,ppid,command为参数调用system函数,从而在程序中执行ps命令,整个程序在ps命令完成后才从system调用中返回。
第二个例子中,我们运行的是我们自己编译出来的命令;这两个例子的优缺点:好处:能够在代码中去执行某一个shell或者用户命令,不需要shell命令提示符。
缺点:程序必须等待system函数启动的进程结束后才能继续,因此我们不能立刻执行其他任务。
在第三个例子中,对system函数的调用将在shell命令( ps -o pid,ppid,command &)交给系统后立即返回。
由于它是一个在后台运行程序的请求,所以ps程序一启动shell就返回了,这与我们在shell提示符下执行下面这条命令的效果是一样的:$ps -o pid,ppid,command &困扰:在ps命令还未来得及打印出它的输出结果之前,system3程序就打印出字符串Done然后退出了。
在system3程序退出后,ps命令继续完成它的输出。
这类的处理往往会给用户带来很大的困扰。
输出信息乱了!如果想要用好进程,我们就需要对他们的行为进行细致的控制。
3.2 替换进程映像【exec函数】先看例程:例程解析:程序先打印它的第一条语句:Running ps -o pid,ppid,command with execlp接着调用execlp,execlp这个函数在当前环境变量(PA TH)里面寻找我们所给参数中的第一个参数”ps”为命令进行执行,并以第二个参数为命令参数。
就好象我们在shell提示符下执行了$ps -o pid,ppid,commandPs命令结束时,整个execlp程序结束,退出到shell命令提示符状态。
并没有返回到execlp函数,打印第二条语句Done。
事实上,这里发生的是,当execlp启动了ps -o pid,ppid,command后,ps 进程替代了execlp 进程。
Ps进程作为新进程,其pid,ppid,和nice值与原先execlp进程一样。
Execlp函数一带成功过渡到参数里面的进程,就不会返回!【常量指针与指针常量问题,参考《常量指针_指针常量.doc》】【Exec函数的详细介绍,参考《Exec函数.doc》】3.3 复制进程【fork】要想让进程同时执行多个函数,我们可以使用线程或从原程序中创建一个完全分离的进程,后者就像init的做法一样,而不像exec调用那样用新程序替换当前执行的进程。
我们可以通过调用fork创建一个新进程。
这个系统调用复制当前进程,在进程表中创建一个新的表项,新的表项中的许多属性与当前进程是相同的。
新进程几乎与原进程一模一样,执行的代码也完全相同,但新的进程有自己的数据空间,环境和文件描述符。
3.3.1 头文件与函数原型#include <sys/types.h>#include <unistd.h>Pid_t fork(void);3.3.2 函数功能Fork函数调用,复制当前进程,从而产生一个新进程。
被复制的进程叫父进程。
子进程除了有自己的数据空间,环境和文件描述符,进程表项中的其他部分包括执行代码与父进程一模一样。
返回值:Fork函数调用一次返回两个值,如果返回值为0,那么是子进程代码返回的,如果返回值大于0,那么是父进程所运行的代码返回的。
3.3.3 例程:3.3.4 例程解析:这个程序以两个进程的形式运行。
子进程被创建并且输出消息5次。
原进程(即父进程)只输出消息3次。
这样,造成的现象是:父进程在子进程打印完它的全部消息之前就结束了,因此我们将看到在输出内容中混杂着一个shell提示符。
3.4 等待一个进程【wati】当用fork启动一个子进程时,子进程就有了自己的生命周期并独立运行。