日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Linux进程全解7——父进程wait / waitip回收子进程

發布時間:2023/12/20 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux进程全解7——父进程wait / waitip回收子进程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容源于朱有鵬《物聯網大講堂》的課程學習整理,如有侵權,請告知刪除。


一、wait介紹

1、wait的工作原理

(1)子進程結束時,系統向其父進程發送SIGCHILD信號;

(2)父進程調用wait函數后阻塞;

(3)父進程被SIGCHILD信號喚醒,然后去回收僵尸子進程;

(4)父子進程之間是異步的,SIGCHILD信號機制就是為了解決父子進程之間的異步通信問題,讓父進程可以及時的去回收僵尸子進程。

(5)若父進程沒有任何子進程則wait返回錯誤。


2、wait實戰編程


(1)wait的參數status

  • status用來返回子進程結束時的狀態;
  • 父進程通過wait得到status后,就可以知道子進程的一些結束狀態信息。

(2)wait的返回值pid_t

  • 本次wait回收的子進程的PID。
  • 當前進程可能有多個子進程,wait函數阻塞直到其中一個子進程結束wait就會返回,wait的返回值可以用來判斷到底是哪一個子進程本次被回收了。

(3)總結

  • wait主要是用來回收子進程資源,回收同時還可以得知被回收子進程的pid和退出狀態。

(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("子進程已經被回收,子進程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宏

  • 這幾個宏用來獲取子進程的退出狀態;
  • 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);這種表示父進程要非阻塞式的回收子進程。此時如果父進程執行waitpid時子進程已經先結束等待回,收則waitpid直接回收成功,返回值是回收的子進程的PID;如果父進程waitpid時子進程尚未結束則父進程立刻返回(非阻塞),但是返回值為0(表示回收不成功)。

4、竟態初步引入

竟態,全稱是競爭狀態

  • 多進程環境下,多個進程同時搶占系統資源(內存、CPU、文件IO);
  • 競爭狀態對OS來說是很危險的,此時OS如果沒處理好就會造成結果不確定;
  • 寫程序當然不希望程序運行的結果不確定,所以寫程序時要盡量消滅競爭狀態;
  • 操作系統提供了一系列的消滅竟態的機制。

總結

以上是生活随笔為你收集整理的Linux进程全解7——父进程wait / waitip回收子进程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。