进程等待与终止
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]
![](http://img.blog.csdn.net/20160608114110394?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[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]
![](http://img.blog.csdn.net/20160608114116003?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[align=left]父进程的执行流:(因为是以非阻塞的方式等待子进程,在子进程没有退出时,waitpid的返回值一直都是0,所以要以循环的方式等待,直到waitpid的返回值为子进程的ID时,才等待成功)[/align]
![](http://img.blog.csdn.net/20160608114127382?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[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]
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]
相关文章推荐
- 深入多线程之:Wait与Pulse的使用详解
- Java的wait(), notify()和notifyAll()使用心得
- Java线程中sleep和wait的区别详细介绍
- 深入探讨:unix多进程编程之wait()与waitpid()函数
- 深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解
- C#中sleep和wait的区别分析
- 详细分析java线程wait和notify
- Thread Signaling
- java wait notify
- 深入理解Oracle中的latch
- wait status
- sleep与wait
- Java notify、notifyAll,wait的描述
- 多线程 wait sleep synchronized
- java wait notify的用法
- 线程间通信
- java中 wait notify实现生产者-消费者问题
- Java中的等待/通知机制(wait/notify)
- Object.wait()
- linux shell wait process finished,等待线程执行结束