信號 09 | SIGCLD語義

1. SIGCLD信號

  • SIG_DFL :默認的處理方式是不理會這個信號,但是也不會丟棄子進程狀態,所以如果不用wait,waitpid對其子進行進行狀態信息回收,會產生僵尸進程。
  • SIG_IGN :忽略的處理方式,這個方式和默認的忽略是不一樣的語意,暫且我們把忽略定義為SIG_IGN,在這種方式下,子進程狀態信息會被丟棄,也就是自動回收了,所以不會產生僵尸進程,但是問題也就來了,wait,waitpid卻無法捕捉到子進程狀態信息了,如果你隨后調用了wait,那么會阻塞到所有的子進程結束,并返回錯誤ECHILD,也就是沒有子進程等待。
  • .自定義處理方式:SIGCLD會立即檢查是否有子進程準好被等待,這便是SIGCLD最大漏洞了,一旦在信號處理函數中加入了信號處理方式重建的步驟,那么每次設置SIGCLD處理方式時,都會去檢查是否有信號到來,如果此時信號的確到來了,先是調用自定義信號處理函數,然后是調用信號處理方式重建函數,在重建配置的時候,會去檢查信號是否到來,此時信號未被處理,會再次觸發自定義信號處理函數,一直循環。?所以在處理SIGCLD時,應該先wait處理掉了信號信息后,再進行信號處理方式重建。

1.1 測試代碼:

#include <sys/wait.h>static void sig_cld(int);int main()
{pid_t pid;if (signal(SIGCLD, sig_cld) == SIG_ERR)perror("signal error");if ((pid = fork()) < 0)perror("fork error");else if (pid == 0) { /* child */sleep(2);_exit(0);}pause(); /* parent */exit(0);
}static void sig_cld(int signo) /* interrupts pause() */
{pid_t pid;int status;printf("SIGCLD received\n");if (signal(SIGCLD, sig_cld) == SIG_ERR) /* reestablish handler */perror("signal error");if ((pid = wait(&status)) < 0) /* fetch child status */perror("wait error");printf("pid = %d\n", pid);
}

輸出結果:程序一行行地重復輸出“SIGCLD received”

2. SIGHCLD信號

  • 如果父進程在fork之后調用wait,就會阻塞,直到有一個子進程退出。
  • 如果父進程在fork之前先signal(SIGCLD, Fun),即注冊了SIGCLD的信號處理函數。然后做自己的事情。?當子進程退出時,會給父進程發送一個SIGCLD信號。然后Fun函數就會執行。可以在Fun函數中調用wait獲得子進程退出時的狀態,并且此時wait不會阻塞。?當Fun函數執行完后,父進程又繼續做自己的事情。

3.1 測試代碼:

#include<sys/wait.h>
#include<stdio.h>
#include<sys/wait.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>static void sig_cld(int signo)
{pid_t pid;int status;printf("SIGCLD received\n");// wait() 返回退出狀態if((pid = wait(&status)) <0) {printf("wait error\n");}printf("pid = %d ",pid);
}int main()
{pid_t pid;// if(signal(SIGCLD,sig_cld) ==  SIG_ERR)if(signal(SIGCHLD,sig_cld) ==  SIG_ERR) {printf("signal error\n");exit(-1);}if((pid = fork()) < 0) {printf("fork error\n");exit(-1);}else if(pid == 0) {//childprintf("%d fork a new child %d\n",getppid(),getpid());sleep(1);exit(0);} else {//parent// sig_cld(0);int i,j;for(i=0;i<100;i++) {for(j=0;j<10000000;j++);printf("%d ",i);}}
}

輸出結果:

3. 參考資料

  • SIGCLD處理方式
  • 關于SIGHCLD和SIGCLD

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385631.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385631.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385631.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三面美團Java崗,java電子書下載百度云

Spring 全家桶&#xff1a; Spring 原理Spring面試題思維導圖面試題Spring視頻 Spring 原理 Spring特點Spring 核心組件Spring常用模塊Spring主要包Spring常用注解Sping第三方結合Spring 10C原理Spring APO原理Spring MVC原理Spring Boot原理JPA原理Mybatis緩存Tomcat架構 Sp…

【信號】函數kill、raise、abort、alarm

一、函數kill 1. kill函數原型&#xff1a; int kill(pid_t pid, int signo); //signo:信號名分析&#xff1a; pid > 0&#xff1a; 發送信號給指定的進程pid 0&#xff1a; 發送信號給調用kill函數進程屬于同一個進程組的所有進程pid < 0&#xff1a;信號signo將…

三面美團Java崗,尚學堂java馬士兵全套

SpringBoot經典之作 進入Spring Boot世界 準備開發環境搭建開發工具 基礎 Spring Boot基礎分層開發Web應用程序響應式編程 進階 Spring Boot進階用ORM操作SQL數據庫接口架構風格——RESTful集成安全框架&#xff0c;實現安全認證和授權集成Redis&#xff0c;實現高并發集成R…

信號 09 | 信號概念

信號的概念 信號在我們的生活隨處可見&#xff0c;如&#xff1a;古代戰爭中摔杯為號&#xff1b;代戰爭中的信號彈&#xff1b;體育比賽中使用的信號槍&#xff0c;它們都有共性&#xff1a;1. 簡單 2. 不能攜帶大量的信息 3. 滿足某個特定條件才發送 信號是信息的載體&…

一招徹底幫你搞定HashMap源碼,項目實戰

ES 集群架構演進之路 1、初始階段 訂單中心ES初始階段如一張白紙&#xff0c;架設方案基本沒有&#xff0c;很多配置都是保持集群默認配置。整個集群部署在集團的彈性云上&#xff0c;ES集群的節點以及機器部署都比較混亂。同時按照集群維度來看&#xff0c;一個ES集群會有單…

【信號】信號集、sigprocmask、sigpending

一、信號集操作函數 內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在用程序自定義set來改變mask&#xff0c;來達到屏蔽指定信號目的。 sigset_t set; // typedef unsigned long sig…

一招讓你拿下seata分布式事務框架,看這篇文章準沒錯!

第一階段&#xff1a;架構師筑基必備技能 我覺得&#xff0c;但凡是個成年人應該都清楚扎實的基本功對自己的工作幫助有多重要。從各大招聘網站的招聘要求來看&#xff0c;第一條都明確說明需要扎實的Java基礎。因此&#xff0c;一般筆試以及面試的第一輪&#xff0c;對基礎的…

函數signal、sigaction

二、函數sigaction 修改信號處理動作(通常在Linux用來注冊一個信號的捕捉函數) #inlcude<signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 參數&#xff1a; act&am…

一文了解OOM及解決方案,你還看不明白?

InnoDB總體結構 首先我們來看官網的一張圖(圖片來源于MySQL官網)&#xff1a; 從上圖中可以看出其主要分為兩部分結構&#xff0c;一部分為內存中的結構(上圖左邊)&#xff0c;一部分為磁盤中的結構(上圖右邊) 內存結構 InnoDB內存中的結構主要分為&#xff1a;Buffer Pool,…

信號 09 | 函數pause

函數pause 調用該函數可以造成進程主動掛起&#xff0c;等待信號喚醒&#xff0c;調用該系統調用的進程處于阻塞狀態(主動放棄CPU)直到有信號遞達將其喚醒。 將進程置為可中斷睡眠狀態。然后 它調用schedule()&#xff0c;使linux進程調度器找到另一個進程來運行。pause使調用…

一文搞懂JVM架構和運行時數據區,全網最新

1.Java基礎面試知識點 Java中和equals和hashCode的區別int、char、long各占多少字節數int與integer的區別探探對Java多態的理解String、StringBuffer、StringBuilder區別什么是內部類&#xff1f;內部類的作用抽象類和接口區別抽象類的意義抽象類與接口的應用場景抽象類是否可…

一條正確的Java職業生涯規劃,幫你突破瓶頸

面試題模塊介紹&#xff1a; 一、Java 基礎 JDK 和 JRE 有什么區別&#xff1f; 和 equals 的區別是什么&#xff1f;兩個對象的 hashCode()相同&#xff0c;則 equals()也一定為 true&#xff0c;對嗎&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.roun…

【線程】線程基本函數

一、pthread_self函數 功能&#xff1a;獲取線程ID。 pthread_t pthread_self(void); 線程ID&#xff1a;pthread_t類型&#xff0c;本質&#xff1a;在Linux為無符號整數(%lu)&#xff0c;其他系統可能是結構體實現線程ID是進程內部識別標志。&#xff08;兩個進程間&#…

一條正確的Java職業生涯規劃,順利通過阿里Java崗面試

珍藏版&#xff08;1&#xff09;——Mybatis入門 1.什么是MyBatis 2.為什么我們要用Mybatis? 3.Mybatis快速入門 3.1 導入開發包 3.2準備測試工作 3.3 創建mybatis配置文件 3.4 編寫工具類測試是否獲取到連接 3.5 創建實體與映射關系文件 3.6 編寫DAO 4.Mybatis工作…

線程控制 12 | 線程屬性

本節作為指引性介紹&#xff0c;linux下線程的屬性是可以根據實際項目需要&#xff0c;進行設置&#xff0c;之前我們討論的線程都是采用線程的默認屬性&#xff0c;默認屬性已經可以解決絕大部分開發遇到的問題。如我們對程序的性能提出更高的要求那么需要設置線程屬性&#x…

一次違反常規的Java大廠面試經歷,系列教學

第一部分 Java相關以及答案 答案 第二部分算法跟編程 第三部分html&JavaScript&ajax部分 答案 第四部分Javaweb部分 答案 第五部分數據庫部分 答案 第六部分XML部分 答案 第七部分.流行的框架與新技術 答案 第八、九部分.軟件工程與設計模式以及j2ee部分 最后 筆者…

函數perror、strerror

perror函數 函數原型&#xff1a; #include<stdio.h> void perror(const char *msg); 測試代碼&#xff1a; #include<unistd.h> #include<errno.h> #include<stdio.h>int main() {int ret;ret close(10);if(ret -1) {perror("close error…

一次違反常規的Java大廠面試經歷,重難點整理

目錄 Kafka的基本介紹Kafka的設計原理分析Kafka數據傳輸的事務特點Kafka消息存儲格式副本&#xff08;replication&#xff09;策略Kafka消息分組&#xff0c;消息消費原理Kafak順序寫入與數據讀取消費者&#xff08;讀取數據&#xff09; Kafka的基本介紹 Kafka是最初由Lin…

一步搞定你疑惑的數據結構與算法系列,原理+實戰講解

螞蟻金服一面&#xff1a; 下午杭州的電話&#xff0c;問有沒有空&#xff0c;果斷有空&#xff0c;雖然感覺略顯緊張&#xff0c;有點懵逼。 面試的題目&#xff1a; HashMap和Hashtable的區別實現一個保證迭代順序的HashMap說一說排序算法&#xff0c;穩定性&#xff0c;復…

互斥量(互斥鎖)

一、互斥量mutex Linux提供一把互斥鎖mutex(也稱之為互斥量)每個線程在對資源操作前都嘗試先加鎖&#xff0c;成功加鎖才能操作&#xff0c;操作結束后解鎖。資源還是共享的&#xff0c;線程間也還是競爭的&#xff0c;但通過鎖將資源的訪問變為互斥操作&#xff0c;而后與時間…