日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

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

發(fā)布時(shí)間:2023/12/20 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux进程全解7——父进程wait / waitip回收子进程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下內(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。