进程?
即linux(类unix系统)对于运行的程序的一个抽象。
谈谈wait和waitpid
wait和waitpid是linux支持的两种system call(系统调用),是父进程获取子进程状态的方式。
头文件:
#include <sys/types.h>
#include <sys/wait.h>
函数原型:
- pid_t wait (int *status)
- pid_t waitpid(pid_t pid,int * status,int options)
wait()
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则status可以设成NULL
waitpid()
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用waitpid()子进程已经结束,则waitpid()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数status可以设成NULL。参数pid为欲等待的子进程识别码
pid: 当pid为-1时等待任一进程,(相当于和wait差不多),为0则等待和当前进程id一样的,如果为其他负值,则取绝对值,再等待该pid所指定的进程。
options: 为0,或为WNOHANG和WUNTRACED的or组合。
WNOHANG:如果没有任何已经结束的子进程则马上返回,不予以等待。此时返回值为0
WUNTRACED:如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会
status状态值
对status状态判断的宏定义:
- WIFEXITED(status) 如果子进程正常结束返回的值。取exit或_exit的低8位
- WEXITSTATUS(status) 取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才使用此宏
- WIFSIGNALED(status) 当子进程因为信号而结束则返回true
- WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏
- WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况
- WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED来判断后才使用此宏
谈谈僵尸进程和孤儿进程
根据以上的资料,我们知道了wait和waitpid的用法,可以说waitpid用来等待特定进程,而wait等待任一进程(waitpid也可以等待任一进程,如果只是需要option的区别的话)。
首先,linux通过父进程来创建子进程,父进程通过wait/waitpid来得到子进程的运行状态,当子进程运行完之后,父进程得到子进程的状态,进行接下来的工作。
那么问题来了,如果父进程一直不愿意调用wait/waitpid呢?
子进程在运行完毕之后是不会完全被销毁掉的,而是会保留一些基础数据:
(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)
僵尸进程则是说的这样一类进程,父进程只管创建,不管回收(一直没有调用wait/waitpid,但是父进程本身又没有结束),子进程就进入僵尸进程状态,标识为Z(zombie)。
孤儿进程则与之对应,说的是父进程不管回收,但是父进程自己死掉了(本身结束了),于是子进程就会被init进程接管,init进程会一直循环wait来将子进程彻底释放掉。
危害?影响?
孤儿进程没有较大影响,毕竟该子进程会被init很快就回收掉,但是僵尸进程就不同了,由于进程号有限,在进程号使用完之后,会导致无法创建新的进程,所以一定要注意处理僵尸进程。
引用:
http://blog.csdn.net/guoping16/article/details/6583466
http://blog.csdn.net/guoping16/article/details/6583466