还剩34页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
进程控制UNIX欢迎来到进程控制课程本课程将深入探讨操作系统中进程管UNIX UNIX理的核心概念和技术进程是现代操作系统的基本执行单位,理解和掌握进程控制对于系统编程和应用开发至关重要在接下来的课程中,我们将详细讲解进程的创建、执行、终止以及相关的控制机制,帮助您构建坚实的系统编程基础通过本课程,您将能够UNIX编写高效、可靠的多进程应用程序课程大纲进程概述进程创建与执行12本部分将介绍进程的基本概念、进程与程序的区别、进程的这部分将详细讲解、以及函数族等关键函fork vfork exec特征以及进程的生命周期,为后续内容奠定理论基础数,说明如何在系统中创建新进程并执行不同的程序UNIX进程终止与等待进程控制相关函数34这部分将探讨进程的正常和异常终止方式,以及如何通过本部分将介绍进程调度、进程环境、用户标识和资源限制等、等函数实现进程间的同步与资源回收方面的控制函数,帮助您更全面地掌握进程管理技术wait waitpid什么是进程?进程定义进程与程序的区别进程的特征进程是操作系统分配资源的基本单位,程序是静态的指令集合,存储在磁盘上;进程具有独立性(拥有独立的地址空是正在执行的程序的实例它包含程序而进程是动态的执行实体,在内存中运间)、动态性(有生命周期)、并发性代码(文本)、数据、堆栈以及各种属行一个程序可以对应多个进程,例如(多个进程可以并发执行)和异步性性(如打开的文件、地址空间等)多次执行同一程序会创建多个进程(进度不可预知)等特征进程的状态就绪态2进程已获得除外的所有必要资源CPU运行态1进程正在上执行或等待分配资源CPU CPU阻塞态进程等待某一事件(如完成)发生I/O3进程在其生命周期中会在这三种基本状态之间转换当进程创建后,首先进入就绪态,等待调度获得后进入运行态,如果在运CPU CPU行过程中需要等待某事件,则进入阻塞态当等待的事件发生后,进程重新回到就绪态除了这三种基本状态,有些系统还定义了创建态、终止态等附加状态,用于描述进程的完整生命周期理解进程状态转换对于编写高效的多进程程序至关重要进程控制块()PCB进程管理调度状态、优先级1内存管理2内存指针、段表文件管理3打开文件、工作目录资源管理4分配的资源列表核心信息5进程、用户、信号处理ID ID进程控制块(,)是操作系统用来存储管理进程的数据结构,包含了进程的所有状态信息是进程存在的唯一标识,操作系统通过来识别进程并进Process ControlBlock PCB PCB PCB行管理每当创建一个新进程时,操作系统就会为该进程创建一个,并在进程终止时释放它通常作为一个结构体实现,在不同的系统实现中可能有所差异,但基本内容大致相同PCBPCBUNIX进程标识符()PID的重要性的分配规则PID PID进程是系统识别进程的唯一通常是一个非负整数,由系ID PID标识符,所有与进程相关的操统按照一定规则分配当进程作(如终止、暂停等)都需要终止后,其会在一段时间后PID通过来指定目标进程被回收再利用最大值在不PID PID PID在许多系统调用中作为参数使同系统中可能不同,通常通过用系统配置确定特殊的含义PID通常是调度程序进程(),是进程(系统引导PID0swapper PID1init后启动的第一个用户级进程),在某些系统中是页面守护进程PID2()这些特殊进程负责系统的基本功能pagedaemon进程的层次结构进程()init PID1系统引导后启动的第一个用户级进程,是所有用户进程的祖先负责管理系统服务和守护进程,以及对孤儿进程的收养进程通常不会终init止,除非系统关闭中间层级进程由进程直接或间接创建的服务进程和用户会话进程这些进程通常init会创建更多子进程来执行具体任务,形成进程树的中间层级叶子进程进程树的末端节点,通常是执行具体任务的进程,如用户命令或应用程序这些进程可能没有子进程,执行完任务后直接终止在系统中,除了内核进程外,所有进程都由父进程通过函数创建,形成严UNIX fork格的层次结构,可以用进程树来表示子进程继承父进程的大部分属性,但拥有自己的地址空间和资源进程创建函数fork调用fork1当程序调用函数时,操作系统会创建当前进程的一个副本作为子进fork程子进程与父进程几乎相同,但拥有独立的地址空间返回fork2函数在父进程中返回子进程的,在子进程中返回如果创建失fork PID0败,则在父进程中返回,不创建子进程-1执行后续代码3调用后,父子进程都从返回处继续执行,程序需要根据fork forkfork的返回值区分父子进程并执行不同的代码路径是系统中创建新进程的基本机制调用成功后,将产生两个几乎相同的进程,它们拥有相同的代码,但是独立的数据副本通常,子进程会通过函数族执fork UNIXexec行新程序,而父进程则继续执行原有任务或等待子进程完成示例代码fork基本用法示例#include#includeint main{pid_t pid;pid=fork;if pid0{//创建失败fprintfstderr,Fork failed\n;return1;}else if pid==0{//子进程代码printfChild process,PID=%d\n,getpid;}else{//父进程代码printfParent process,Child PID=%d\n,pid;}return0;}上面的代码演示了fork的基本用法调用fork后,根据返回值区分父子进程负值表示创建失败,零表示当前是子进程,正值(子进程的PID)表示当前是父进程注意fork之后的代码在父子进程中都会执行如果需要父子进程执行不同的任务,必须通过fork的返回值进行判断每次调用fork都会创建一个新进程,如果在循环中调用,可能会创建大量进程,需要谨慎处理后的内存共享fork写时复制()共享的资源不共享的资源1Copy-on-Write23机制子进程继承父进程的打开文件描述符、子进程拥有独立的进程、父进程、ID ID为了提高效率,现代UNIX系统在fork当前工作目录、根目录、文件模式创建内存锁、未处理的闹钟、记录锁等资源时并不实际复制物理内存页面,而是让掩码、信号处理设置等资源父子进程此外,子进程的未决信号集会被清除,父子进程共享相同的物理页面,并将这共享打开的文件,一个进程的文件操作确保子进程不会继承父进程的信号状态些页面标记为只读只有当任一进程尝会影响另一个进程试修改共享页面时,系统才会为该进程创建页面的私有副本函数vfork基本原理使用场景注意事项函数是的一种特殊变体,当之后立即调用时,完全复创建的子进程必须谨慎操作共享vfork forkfork execvfork设计用于子进程立即执行族函数制地址空间是不必要的浪费在这种情的地址空间,不应修改变量或返回函数exec的场景与不同,不复制况下,使用可以提高效率(可能破坏栈结构)调用后,fork vfork vforkvfork父进程的地址空间,而是让子进程共享特别适合创建短生命周期的、执父进程会被挂起,直到子进程调用vfork父进程的地址空间,直到子进程调用行外部命令的子进程或,使用不当可能导致死锁exec exit或exec exit进程执行函数族execexecl1使用参数列表指定命令行参数execlp2使用环境变量搜索文件PATHexecle3允许指定新的环境变量列表execv4使用参数数组指定命令行参数execvp5参数数组形式且使用搜索PATH函数族提供了在当前进程中执行新程序的能力这些函数会用新程序替换当前进程的代码段、数据段和堆栈等,但保留进程、打开文件描述符等进程属性exec ID函数名中的字母表示不同的特性表示参数以列表形式提供;表示参数以数组形式提供;表示使用环境变量寻找执行文件;表示可以传递新的环境变量选择合适的函数l vp PATHe exec变体取决于具体的应用需求函数族的工作原理exec替换进程映像保留的进程属性改变的进程属性调用会用新程序的代码和数据替换当前进尽管代码和数据被替换,但进程、父进程、调用会关闭设置了标志的exec ID ID execFD_CLOEXEC程的代码和数据,重新初始化堆栈等内存区域进程组、会话、实际用户组、文件锁、文件描述符,重置信号处理为默认值,丢弃内ID ID/ID原有程序的代码和数据将被丢弃,不再可访问信号处理方式等属性会被保留存映射,删除内存锁以及清除任何未处理的信号函数族不会创建新进程,而是在当前进程上下文中加载并执行新程序这是系统中实现命令替换和程序执行的基本机制通常与配exec Unixfork合使用,先创建子进程,再在子进程中执行新程序函数族示例代码exec示例execl#include#includeint main{printf执行ls命令列出当前目录文件\n;execl/bin/ls,ls,-l,NULL;//如果exec成功,不会执行到这里printfexec调用失败!\n;return1;}示例execvp#include#includeint main{char*args[]={ls,-l,NULL};printf使用PATH环境变量查找并执行ls命令\n;execvpls,args;//如果exec成功,不会执行到这里printfexec调用失败!\n;return1;}以上示例展示了exec函数族的基本用法注意,如果exec调用成功,后面的代码不会被执行,因为当前进程已被新程序替换只有当exec调用失败(如找不到指定的程序文件)时,程序才会继续执行exec之后的代码函数system优点2使用简单,一行代码即可执行复杂的命令shell支持特性如重定向、管道、通配符等,无工作原理shell需自行处理这些细节适合快速开发和原型设计函数通过创建子进程,然后在子进程system中执行命令来实现命令执行它综合了shell
1、和的功能,提供了一种简fork execwait缺点便的执行系统命令的方式效率较低,每次调用都需要创建进程安shell全性较差,可能导致命令注入攻击对执行过程3的控制有限,难以进行精细化操作函数的实现通常涉及三个步骤首先调用创建子进程,然后在子进程中调用加载,最后在父进程中调用等待system forkexec shellwait子进程结束并获取返回状态它的返回值是的终止状态shell由于安全性考虑,在需要高安全性的程序中应避免使用,尤其是当命令字符串中包含用户输入时在这种情况下,应该使用更安system全的和组合实现同样的功能forkexec进程终止的方式正常终止异常终止进程执行完成其预定任务后自行终止这种情况下,进程会释进程因错误或外部因素被强制终止异常终止可能是因为接收放所有占用的资源,关闭打开的文件,并向父进程返回一个终到不能处理的信号(如、),或者调用SIGKILL SIGSEGV止状态正常终止可以通过多种方式实现,如从函数返函数导致的这种情况下,进程可能无法进行正常的main abort回、调用函数等清理工作,资源释放由操作系统负责exit无论进程以何种方式终止,操作系统都会回收进程占用的资源,如内存、文件描述符等但是,进程的退出状态会保留在系统中,直到父进程通过或函数获取它,这是防止产生僵尸进程的重要机制wait waitpid正常终止的方法从返回main程序执行到函数的末尾并返回,这是最常见的程序终止方式返回值成main为进程的退出状态,按照标准,返回表示成功,非表示出错C00调用exit调用标准库函数可以在程序的任何位置终止进程会执行一些清理exit exit工作,如刷新标准缓冲区、调用通过注册的函数等,然后终止进程I/O atexit调用或_exit_Exit这些函数直接进行系统调用终止进程,不执行任何清理工作它们通常用于在之后的子进程中快速退出,避免清理导致的副作用fork线程相关的终止方式在多线程程序中,最后一个线程从其启动例程返回或调用也会pthread_exit导致进程终止这些方式在单线程程序中不适用异常终止的方法调用abort函数会导致进程异常终止,并产生信号这通常用于在检测abort SIGABRT到严重错误时主动终止程序,如断言失败程序终止前会生成核心转储文件,便于调试接收信号当进程接收到某些信号(如、)且未设置相应的处理函数SIGKILL SIGSEGV或处理函数返回时,进程会终止这些信号可能由其他进程发送,或由系统在检测到特定条件时产生线程取消在多线程环境中,当最后一个线程响应取消请求时,整个进程也会终止线程取消是一种线程间协作的机制,用于在一个线程中请求另一个线程终止异常终止通常意味着程序遇到了无法恢复的错误状态在开发过程中,应尽量避免异常终止,通过良好的错误处理机制使程序能够正常终止但在某些情况下,如检测到内存损坏时,异常终止可能是防止进一步损害的最佳选择、和的区别exit_exit_Exit函数标准缓冲区处理终止处理程序刷新调用exit ISOC不刷新不调用_exit POSIX.1不刷新不调用_Exit ISOC99函数是标准库函数,它在终止进程前会执行以下清理工作刷新所有打开的标exit C准流的缓冲区,调用通过和注册的所有终止处理函数(按照注册时I/O atexiton_exit的相反顺序调用)和函数直接调用系统调用终止进程,不执行任何用户空间的清理工作_exit_Exit两者的区别在于标准来源是标准定义的,而是引入的_exit POSIX.1_Exit ISOC99在大多数系统上,的实现通常就是调用UNIX_Exit_exit在后立即终止子进程时,应使用或,避免刷新已被父进程刷新的缓冲fork_exit_Exit区,防止出现重复输出等问题终止状态与退出状态概念辨析获取终止状态退出状态()是进程主动父进程可以通过或函exit statuswait waitpid结束时通过或指定的值,数获取子进程的终止状态这些函数exit return范围为,通常表示成功,非返回的状态是一个整数,需要通过特0-25500表示错误终止状态(定的宏(如、termination WIFEXITED)是系统记录的进程结束方式等)来解析其中包含status WEXITSTATUS的完整信息,包括退出状态、是否因的具体信息信号终止及其信号编号等终止状态的含义宏判断进程是否正常终止,提取正WIFEXITEDstatus WEXITSTATUSstatus常终止时的退出码判断是否因信号终止,WIFSIGNALEDstatus提取导致终止的信号编号其他宏可以检查是否产生了核心WTERMSIGstatus转储或进程是否被停止孤儿进程定义产生原因12孤儿进程是指父进程已经终止,父进程可能因为完成任务、遇到而子进程仍在运行的进程当一错误或收到终止信号而提前退出,个进程创建了子进程后自己退出,而子进程因为执行较长的任务或而其子进程还在运行,这些子进进入阻塞状态而继续运行,从而程就成为孤儿进程导致子进程成为孤儿进程系统处理方式3在系统中,孤儿进程会被进程(为)收养,成为进程的子进UNIX initPID1init程进程会定期检查其子进程的状态,当子进程终止时,进程会调用init init函数获取其终止状态,防止孤儿进程变成僵尸进程wait孤儿进程本身不会对系统造成危害,它们会被进程接管并正常运行直至完成这种init机制确保了即使父进程异常终止,子进程也能继续执行并最终被正确回收,避免了资源泄漏僵尸进程定义1僵尸进程是指已经终止但其父进程尚未调用或获取其终止状态的进程这种进wait waitpid程已经释放了几乎所有资源,但在进程表中仍然保留一个条目,记录其终止状态和资源使用信息产生原因2父进程创建子进程后,没有调用或等函数来获取子进程的终止状态,或者父进wait waitpid程忙于其他任务,没有及时处理子进程终止的信号这导致子进程终止后变成僵尸状态危害3僵尸进程虽然几乎不占用系统资源,但会占用进程表中的条目如果系统中存在大量僵尸进程,可能导致进程表溢出,使系统无法创建新进程,影响系统正常运行避免方法4父进程应该调用、等函数获取已终止子进程的状态;使用信号处理,捕获wait waitpid信号并在信号处理函数中调用;如果不关心子进程状态,可以设置SIGCHLD wait标志忽略信号SA_NOCLDWAIT SIGCHLD进程等待函数wait函数原型功能说明返回值解析函数用于父进程等待任意一个子进程终止成功时返回终止子进程的进程,失败时返回并wait ID-1#include如果调用进程没有子进程,或者其子进程都已经被设置相应的如果成功,且不为,errno statusNULL#include等待过,则立即返回,并设置为则将终止状态信息存储在指向的位置,可以wait-1errno status如果有多个子进程,只等待其中通过等宏来获取具体信息ECHILD waitWIFEXITEDpid_t waitint*status;一个终止函数暂停当前进程的执行,直到一个子进程wait终止,或者收到一个需要处理的信号状态信息通过参数返回,可以用特定的宏来解析status函数示例代码wait#include#include#include#includeint main{pid_t pid,child_pid;int status;pid=fork;if pid0{fprintfstderr,Fork failed\n;exit1;}else if pid==0{//子进程printf子进程PID=%d正在运行\n,getpid;sleep2;//模拟一些工作printf子进程将以状态3退出\n;exit3;}else{//父进程printf父进程PID=%d等待子进程PID=%d终止\n,getpid,pid;child_pid=waitstatus;printf子进程PID=%d已终止\n,child_pid;if WIFEXITEDstatus{printf子进程正常终止,退出状态为%d\n,WEXITSTATUSstatus;}else ifWIFSIGNALEDstatus{printf子进程被信号%d终止\n,WTERMSIGstatus;}}return0;}函数waitpid函数原型与的区别参数说明wait相当于,参数等待指定的子进wait waitpid-1,status,0pid pid0PID#include它只能等待任意子进程而可程;等待与调用进程同一进程waitpid pid=0#include以指定要等待的子进程,还可以通过组的任意子进程;等待任意子pid=-1参数控制等待行为,例如非阻进程(相当于);等待进options wait pid-1pid_t waitpidpid_t pid,塞等待或等待停止的进程程组为的任意子进程参ID|pid|statusint*status,数与相同waitint options;提供了比更灵活的进程waitpid wait等待机制,允许指定要等待的子进程以及等待行为的选项参数waitpidWNOHANG WUNTRACEDWCONTINUED非阻塞等待如果指定如果子进程被停止(接如果子进程曾被停止但的子进程尚未终止,则收到、后来又继续运行(接收SIGSTOP不会阻塞当前、或到信号)且尚waitpid SIGTSTPSIGTTIN SIGCONT进程,而是立即返回信号)且尚未未报告其状态,则返回0SIGTTOU这使得父进程可以执行报告其状态,则返回其其状态这使父进程能其他任务,并定期检查状态这允许父进程监够跟踪子进程的继续执子进程是否已终止,实控子进程的停止状态,行现轮询而非阻塞等待通常用于实现作业控制这些选项可以通过位运算符组合使用,例如表|WNOHANG|WUNTRACED示非阻塞等待且报告被停止的子进程在实现复杂的进程控制逻辑时,这些选项提供了极大的灵活性,允许开发者根据需要定制等待行为函数示例代码waitpid#include#include#include#includeint main{pid_t pid1,pid2;int status;//创建第一个子进程pid1=fork;if pid1==0{printf第一个子进程PID=%d开始运行\n,getpid;sleep2;exit1;}//创建第二个子进程pid2=fork;if pid2==0{printf第二个子进程PID=%d开始运行\n,getpid;sleep4;exit2;}//父进程特别等待第一个子进程printf父进程特别等待第一个子进程PID=%d终止\n,pid1;if waitpidpid1,status,0==pid1{if WIFEXITEDstatus{printf第一个子进程退出码为:%d\n,WEXITSTATUSstatus;}}//非阻塞地检查第二个子进程是否已终止printf非阻塞地检查第二个子进程PID=%d是否已终止\n,pid2;if waitpidpid2,status,WNOHANG==0{printf第二个子进程仍在运行\n;//在这里可以做一些其他工作//最后等待第二个子进程终止waitpidpid2,status,0;if WIFEXITEDstatus{printf第二个子进程退出码为:%d\n,WEXITSTATUSstatus;}}return0;}和函数wait3wait4函数原型相比和的优势12wait waitpidwait3和wait4不仅可以获取子进程的终止状态,#include还可以收集子进程的资源使用统计信息,如CPU时#include间、内存使用、I/O操作次数等这对于性能分析#include和资源监控非常有用#includepid_t wait3int*status,int options,struct rusage*rusage;pid_t wait4pid_t pid,int*status,int options,struct rusage*rusage;这两个函数扩展了wait和waitpid的功能,允许获取终止子进程的资源使用信息资源使用信息的获取3通过rusage参数可以获取struct rusage结构体中的资源使用数据,包括用户CPU时间ru_utime、系统CPU时间ru_stime、最大常驻集大小ru_maxrss、页面错误次数ru_minflt,ru_majflt等详细信息wait3相当于wait4-1,status,options,rusage,它等待任意子进程终止并获取其资源使用情况wait4则提供了更精确的控制,可以指定等待特定的子进程这些函数通常用于需要详细跟踪子进程资源消耗的场景,如性能测试工具或资源管理器信号SIGCHLD产生时机当一个子进程终止、停止或继续运行时,系统会向其父进程发送信SIGCHLD号这个信号提供了一种异步通知机制,使父进程能够及时得知子进程状态的变化默认处理方式信号的默认动作是忽略,这意味着如果父进程没有设置相应的处理SIGCHLD函数,信号将不会产生任何效果这种设计使得父进程可以选择是否关注子进程的状态变化与的关系wait/waitpid通常,父进程会设置信号处理函数,在该函数中调用(通SIGCHLD waitpid常使用选项)来回收已终止的子进程,防止僵尸进程的产生这WNOHANG种方式比轮询等待更高效使用机制可以实现更灵活的进程管理父进程可以继续执行其主要任务,只在子进SIGCHLD程状态变化时才进行处理,而不需要专门的代码来检查子进程状态这对于管理多个并发子进程特别有用进程组定义进程组()ID PGID进程组是一个或多个进程的集合,通进程组等于该组中进程组长的IDPID常由相关的进程组成,例如管道连接可以通过函数获取指定进程getpgid的进程或由同一个作业控制的进程的进程组,通过获取当ID getpgrp每个进程组有一个唯一的进程组,前进程的进程组新创建的进程默IDID且一个进程只能属于一个进程组认继承父进程的进程组ID进程组长进程组长是创建该进程组的进程一个进程可以通过调用函数成为一个setpgid新进程组的组长进程组长可以退出,而其进程组继续存在,只要有进程仍属于该组进程组的主要用途是实现作业控制和信号分发在中启动的一个命令(可能包含shell多个进程,如使用管道连接的命令)通常构成一个进程组信号可以被发送给整个进程组,使得一个操作(如终止)能同时应用于多个相关进程会话会话首进程创建新会话的进程称为会话首进程,其进程ID2成为会话会话首进程通常是登录或由ID shell定义函数创建的进程会话首进程也自动setsid成为一个新进程组的组长会话是一个或多个进程组的集合,通常代表用户的一次登录会话会话将相关的进程组组织1与进程组的关系在一起,并与特定的控制终端相关联(虽然也可以没有控制终端)一个会话可以包含多个进程组,通常分为一个前台进程组和零个或多个后台进程组前台进3程组可以从控制终端读取输入,而后台进程组则不能会话的概念主要用于作业控制和终端管理当用户登录系统时,登录程序创建一个会话,用户的成为会话首进程用户在中启动的所有命shell shell令都属于同一个会话,但可能在不同的进程组中会话还定义了进程组与控制终端之间的关系当控制终端断开连接(如网络断开)时,会向会话中的所有进程组发送信号,通知它们终端SIGHUP已不可用作业控制概念前台作业与后台作业相关命令作业控制是指用户控制多个进程或进程前台作业是当前与控制终端交互的进程命令列出当前会话中的所有jobs shell组执行的能力,允许将进程在前台和后组,可以接收从终端输入的数据和信号作业;命令将后台作业带到前台继续fg台之间切换,暂停和恢复进程的执行后台作业是在后台运行的进程组,不能执行;命令使已停止的作业在后台bg这是交互式的重要特性,使用户直接接收终端输入,但可以向终端输出继续执行;可以暂停当前前台作shell Ctrl+Z可以同时管理多个任务在大多数中,可以通过在命令后业;可以终止当前前台作业shell Ctrl+C加将命令放入后台执行在实现作业控制时,使用进程组和会话的概念来管理相关进程每个管道命令通常构成一个进程组,会跟踪这些进程组shell shell的状态,并在用户发出作业控制命令时使用信号(如、)和系统调用(如)来控制进程组的执行和SIGTSTP SIGCONTtcsetpgrp终端访问权限守护进程定义特征12守护进程是在后台运行并独立于任何守护进程通常具有以下特征没有控控制终端的进程,通常在系统引导时制终端;在后台运行;通常以超级用启动,在系统关闭前一直运行它们户()或特定服务用户身份运行;root提供各种系统服务,如网络服务、日工作目录通常是根目录或特定服务目志记录、硬件管理等,不需要用户直录;文件描述符与标准输入输出错//接交互误通常重定向到或日志文件/dev/null创建步骤3创建守护进程的典型步骤包括调用并让父进程退出;调用创建新会话;fork setsid再次并让父进程退出;更改工作目录;重置文件创建掩码;关闭所有打开的文fork件描述符;重定向标准输入输出错误//守护进程是系统中非常重要的组成部分,负责处理各种后台任务它们的命名通常以UNIX结尾,如(服务器守护进程)、(服务器守护进程)等由于守护d httpdHTTP sshdSSH进程长期运行,开发时需要特别注意资源使用和错误处理,确保它们能够稳定可靠地运行创建守护进程的代码框架#include#include#include#include#include#include#includevoid daemon_initvoid{pid_tpid;/*第一次fork,让父进程退出*/ifpid=fork0{perrorfork;exit1;}else ifpid!=0{exit0;/*父进程退出*/}/*创建新会话,使进程脱离控制终端*/setsid;/*第二次fork,防止进程重新获得控制终端*/ifpid=fork0{perrorfork;exit1;}else ifpid!=0{exit0;/*父进程退出*/}/*更改工作目录到根目录*/chdir/;/*重置文件创建掩码*/umask0;/*关闭所有打开的文件描述符*/for inti=0;i1024;i++{closei;}/*重定向标准输入/输出/错误*/open/dev/null,O_RDONLY;/*stdin*/open/dev/null,O_WRONLY;/*stdout*/open/dev/null,O_WRONLY;/*stderr*/}int main{daemon_init;/*守护进程主循环*/while1{/*执行守护进程的实际工作*/sleep60;/*休眠一分钟*/}return0;}进程调度用户优先级用户可调整的外部优先级1静态优先级2进程类型和用户设置决定动态优先级3根据使用情况动态调整CPU调度策略
4、、其他自定义策略FIFO RR调度器5内核组件,负责选择下一个运行进程进程调度是操作系统的核心功能,决定哪个进程在何时获得资源运行系统采用基于优先级的抢占式调度策略,优先级高的进程优先获得时间,而同优先级的进程则轮流CPU UNIXCPU执行调度策略主要有先进先出,适用于实时进程,一旦获得就运行到完成或阻塞;时间片轮转,每个进程获得固定时间片,用完后转到队列末尾;普通策略,动态调整优先FIFO CPURR级,偏向密集型进程用户可以通过值调整进程优先级,影响调度决策I/O nice函数nice功能使用方法函数用于改变进程的调度优先级,nice通过增加进程的值来降低其优先级#includenice值越大,进程优先级越低,获得nice时间的机会越少值的范围通int niceintincrement;CPU nice常是(最高优先级)到(最低优先-2019级),默认值为0参数表示要增加的值increment nice函数返回新的值,如果出错则返回nice-注意,由于也可能是合法的返回值,1-1需要同时检查来确定是否发生错误errno注意事项普通用户只能增加值(降低优先级),不能减少值(提高优先级)只有超级nice nice用户()可以减少值如果参数导致值超出允许范围,系统会root niceincrement nice自动调整到最接近的有效值。
个人认证
优秀文档
获得点赞 0