1. 进程等待的必要性 子进程退出,父进程如果不管不顾,就可能造成“僵尸进程”的问题,进而造成内存泄露 另外,进程一旦变成僵尸状态,那就刀枪不入,kill -9也无能为力。 最后,父进程派给子进程的任务完成的如何,我们需要知道,如子进程运行完成,结果对还是不对,或者是否正常退出 父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。
2. 进程等待的方法 wait()方法 #include<sys/types.h> #include<sys/wait.h> pid_t wait(int*status); 返回值:成功返回被等待进程pid,失败返回-1。 参数:输出型参数,获取子进程退出状态,若不关心,可以设置为NULL。
3. waitpid方法
pid_t waitpid(pid_t pid,int *status,int options); 返回值:当正常返回时waitpid返回收集到的子进程的进程id,若调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在。
参数: pid: pid=-1,等待任一个子进程,与wait等效。pid>0,等待进程id为pid的进程,即就是等待特定进程。则该参数就是决定等待哪一个进程的参数 status:WIFEXITED(status):若为正常终止子进程返回的状态,则为真。
WEXITSTATUS(status):若WIFEXITED(status),提取子进程退出码。则改参数就是判断子进程的执行状态的一个参数。 options:WNOHANG:若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待,若正常结束,则返回该子进程的ID。该参数默认的行为是挂起调用进程,直到有子进程终止,在等待子进程终止的同时,如果还想做些有用的工作,就使用这个选项。如果设置为WNOHANG就是非阻塞的等待。
注意:如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。 如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。 如果不存在该子进程则立即出错返回。
说这么多,该函数就是等待子进程返回的一个函数,若子进程在执行,则通过设置options的值,来决定如何等待。
设置为WNOHANG:表示不予以等待,做自己的事情,到子进程终止时,在获得它的pid给父进程。
设置为WUNTRACED或WUNTRACED:表示等待。
4. ps -al :列出当前所有的进程
5. 进程退出码,main函数中return 所返回的数字0或非0。echo $?:打印的是离当前进程最近的退出码。
6. 在程序的任何地方调用exit()都回导致进程退出。
7. 获取子进程status wait与waitpid都有一个status参数,该参数是一个输出型参数,由操作系统填充。 如果传递NULL,表示不关心子进程的退出状态信息。若不为空,操作系统会根据该参数,将子进程的退出信息反馈给父进程。 status不能简单的当作整形来看待,可以当做位图来看待。