Linux进程全解7——父进程wait / waitip回收子进程
以下內(nèi)容源于朱有鵬《物聯(lián)網(wǎng)大講堂》的課程學(xué)習(xí)整理,如有侵權(quán),請(qǐng)告知?jiǎng)h除。
一、wait介紹
1、wait的工作原理
(1)子進(jìn)程結(jié)束時(shí),系統(tǒng)向其父進(jìn)程發(fā)送SIGCHILD信號(hào);
(2)父進(jìn)程調(diào)用wait函數(shù)后阻塞;
(3)父進(jìn)程被SIGCHILD信號(hào)喚醒,然后去回收僵尸子進(jìn)程;
(4)父子進(jìn)程之間是異步的,SIGCHILD信號(hào)機(jī)制就是為了解決父子進(jìn)程之間的異步通信問(wèn)題,讓父進(jìn)程可以及時(shí)的去回收僵尸子進(jìn)程。
(5)若父進(jìn)程沒(méi)有任何子進(jìn)程則wait返回錯(cuò)誤。
2、wait實(shí)戰(zhàn)編程
(1)wait的參數(shù)status
- status用來(lái)返回子進(jìn)程結(jié)束時(shí)的狀態(tài);
- 父進(jìn)程通過(guò)wait得到status后,就可以知道子進(jìn)程的一些結(jié)束狀態(tài)信息。
(2)wait的返回值pid_t
- 本次wait回收的子進(jìn)程的PID。
- 當(dāng)前進(jìn)程可能有多個(gè)子進(jìn)程,wait函數(shù)阻塞直到其中一個(gè)子進(jìn)程結(jié)束wait就會(huì)返回,wait的返回值可以用來(lái)判斷到底是哪一個(gè)子進(jìn)程本次被回收了。
(3)總結(jié)
- wait主要是用來(lái)回收子進(jìn)程資源,回收同時(shí)還可以得知被回收子進(jìn)程的pid和退出狀態(tài)。
(4)fork后wait回收實(shí)例
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h>int main(void) {pid_t pid = -1;pid_t ret = -1;int status = -1;pid = fork();if (pid > 0){// 父進(jìn)程//sleep(1);printf("parent.\n");ret = wait(&status);printf("子進(jìn)程已經(jīng)被回收,子進(jìn)程pid = %d.\n", ret);printf("子進(jìn)程是否正常退出:%d\n", WIFEXITED(status));printf("子進(jìn)程是否非正常退出:%d\n", WIFSIGNALED(status));printf("正常終止的終止值是:%d.\n", WEXITSTATUS(status));}else if (pid == 0){// 子進(jìn)程printf("child pid = %d.\n", getpid());return 51;//exit(0);}else{perror("fork");return -1;}return 0; }
(5)WIFEXITED、WIFSIGNALED、WEXITSTATUS宏
- 這幾個(gè)宏用來(lái)獲取子進(jìn)程的退出狀態(tài);
- WIFEXITED:用來(lái)判斷子進(jìn)程是否正常終止(return、exit、_exit退出);
- WIFSIGNALED:用來(lái)判斷子進(jìn)程是否非正常終止(被信號(hào)所終止);
- WEXITSTATUS:用來(lái)得到正常終止情況下的進(jìn)程返回值。
二、waitpid介紹
1、waitpid和wait差別
(1)基本功能一樣,都是用來(lái)回收子進(jìn)程;
(2)waitpid可以回收指定PID的子進(jìn)程;
(3)waitpid可以阻塞式或非阻塞式兩種工作模式。
2、waitpid原型介紹
3、代碼實(shí)例
- ret = waitpid(-1, &status, 0); ?-1表示不等待某個(gè)特定PID的子進(jìn)程而是回收任意一個(gè)子進(jìn)程,0表示用默認(rèn)的方式(阻塞式)來(lái)進(jìn)行等待,返回值ret是本次回收的子進(jìn)程的PID。
- ret = waitpid(pid, &status, 0);等待回收PID為pid的這個(gè)子進(jìn)程,如果當(dāng)前進(jìn)程并沒(méi)有一個(gè)ID號(hào)為pid的子進(jìn)程,則返回值為-1;如果成功回收了pid這個(gè)子進(jìn)程則返回值為回收的進(jìn)程的PID。
- ret = waitpid(pid, &status, WNOHANG);這種表示父進(jìn)程要非阻塞式的回收子進(jìn)程。此時(shí)如果父進(jìn)程執(zhí)行waitpid時(shí)子進(jìn)程已經(jīng)先結(jié)束等待回,收則waitpid直接回收成功,返回值是回收的子進(jìn)程的PID;如果父進(jìn)程waitpid時(shí)子進(jìn)程尚未結(jié)束則父進(jìn)程立刻返回(非阻塞),但是返回值為0(表示回收不成功)。
4、竟態(tài)初步引入
竟態(tài),全稱是競(jìng)爭(zhēng)狀態(tài)
- 多進(jìn)程環(huán)境下,多個(gè)進(jìn)程同時(shí)搶占系統(tǒng)資源(內(nèi)存、CPU、文件IO);
- 競(jìng)爭(zhēng)狀態(tài)對(duì)OS來(lái)說(shuō)是很危險(xiǎn)的,此時(shí)OS如果沒(méi)處理好就會(huì)造成結(jié)果不確定;
- 寫(xiě)程序當(dāng)然不希望程序運(yùn)行的結(jié)果不確定,所以寫(xiě)程序時(shí)要盡量消滅競(jìng)爭(zhēng)狀態(tài);
- 操作系統(tǒng)提供了一系列的消滅竟態(tài)的機(jī)制。
總結(jié)
以上是生活随笔為你收集整理的Linux进程全解7——父进程wait / waitip回收子进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html生物代码,方块方舟全物品代码 生
- 下一篇: linux 其他常用命令