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