您的位置:首页 > 大数据 > 人工智能

进程等待与终止

2016-06-08 11:59 507 查看
僵尸进程:一个子进程在其父进程没有调用
wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父进程退出后该进程将被init回收。
[align=left]
[/align]
[align=left]孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。[/align]
[align=left]******************************************************************************************************************************************************************[/align]
[align=left]一、进程等待的函数 wait/waitpid[/align]



[align=left] [/align]
[align=left](1)wait [/align]
[align=left]参数:通过它拿到子进程的终止状态,如果不关心 ,可将它设置为NULL,它是一个输出型参数。[/align]
[align=left]           子进程的退出码:status的次八位(status>>8)&0xff,也可以用宏WEXITSTATUS(status)查看;[/align]
[align=left]            进程的终止情况:status的低八位(status&0xff),也可以用宏WIFEXITED(status)查看;当进程异常终止时,退出码无意义[/align]
[align=left]
[/align]
[align=left]返回值:成功->返回子进程的pid,失败->返回-1[/align]
[align=left]功能:1、读取子进程退出状态;2、释放子进程的资源(PCB)[/align]
[align=left]
[/align]
[align=left]WEXITSTATUS(status)与WIFEXITED(status)宏解释:[/align]
[align=left]WIFEXITED(status) :1.正常创建父子进程,子进程正常退出,父进程等待,并获取退出状态status。调用该宏,查看输出结果(正常为非0,或1)。2.正常创建父子进程,子进程pause(),父进程等待,并设置获取退出状态status。kill杀掉子进程,调用该宏,查看输出结果(结果为0)。[/align]
[align=left]WEXITSTATUS(status) :若WIFEXITED非零,返回子进程退出码,提取进程退出返回值,如果子进程exit(7),WEXITSTATUS(status)就会返回7.请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义.[/align]
[align=left][/align]
[align=left](2) waitpid[/align]
[align=left]返回值:1、当正常返回的时候waitpid返回收集到的子进程的进程ID;[/align]
                2、如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
                3、如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
                4、当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD。
                                                      
参数:pid:
1、pid=-1,等待任一个子进程。与wait等效。
[align=left]    2、pid>0.等待其进程ID 为pid的子进程。[/align]
[align=left]    3、pid==0等待其组ID等于调用进程组ID的任一个子进程。[/align]
[align=left]    4、pid<-1等待其组ID等于pid绝对值的任一子进程。[/align]
[align=left]           status:WIFEXITED(status) :若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)[/align]
[align=left]                       WEXITSTATUS(status) :若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)[/align]
           options:1、WNOHANG :若pid指定的子进程没有结束,则waitpid()函数返回0,调用waitpid的进程不会被阻塞,将继续执
行;若正常结束,则返回该子进程的ID。
[align=left]                        2、  options==0:调用waitpid的进程会进行阻塞等待。[/align]
[align=left]waiptpid提供了wait没有提供的三个功能:[/align]
[align=left]1. waitpid可等待一个特定的进程[/align]
[align=left]2. waitpid提供了一个wait的非阻塞版本[/align]
[align=left]3. waitpid支持作业控制[/align]
[align=left]
[/align]
[align=left]waitpid的使用例子:[/align]
[align=left]子进程的执行流:(若不说明退出方式,它的退出方式默认为exit(0))[/align]



[align=left]父进程的执行流:(因为是以非阻塞的方式等待子进程,在子进程没有退出时,waitpid的返回值一直都是0,所以要以循环的方式等待,直到waitpid的返回值为子进程的ID时,才等待成功)[/align]



[align=left]
[/align]
[align=left]******************************************************************************************************************************************************************[/align]
[align=left]二、进程终止[/align]
[align=left](1)进程终止的方式有8种,前5种为正常终止,后三种为异常终止:[/align]
[align=left]1从main函数返回;[/align]
[align=left]2调用exit函数;[/align]
[align=left]3调用_exit或_Exit;[/align]
[align=left]4最后一个线程从启动例程返回;[/align]
[align=left]5最后一个线程调用pthread_exit;[/align]
[align=left]6调用abort函数;[/align]
[align=left]7接到一个信号并终止;[/align]
[align=left]8最后一个线程对取消请求做出响应。[/align]
[align=left](2)exit与 _Exit,_exit的区别:[/align]
[align=left]          _exit和_Exit立即进入内核,而exit则要先做一些清理工作(调用执行各终止处理程序,关闭所有标准I/O流),再进入内核。[/align]
[align=left]#include <stdlib.h>[/align]
[align=left]void exit( int status );[/align]
[align=left]void _Exit( int status );[/align]
[align=left]#include <unistd.h>[/align]
[align=left]void _exit( int status );[/align]
[align=left]这三个函数用于正常终止一个程序,三个函数所带的整型参数称为终止状态或退出状态,如果[/align]
[align=left](a)调用这些函数不带参数;[/align]
[align=left](b)main函数中的return语句无返回值;[/align]
[align=left](c)main函数没有声明返回类型为整型;则进程的终止状态是未定义的。[/align]
[align=left]
[/align]
[align=left]main函数返回一个整型值与用该值调用exit是等价的。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息