【Linux】fork和exec中的信號繼承探索

fork和exec中的信號繼承探索

  • 一、結論
  • 二、代碼驗證
    • 2.1 代碼編寫
    • 2.2 代碼執行
  • 三、linux源碼驗證
  • 四、APUE中的驗證
  • 五、其他

一、結論

  1. fork時子進程會繼承父進程的信號處理方式,包括父進程設置信號為SIG_DFLSIG_IGN或捕獲后設置自定義處理函數。
  2. exce時子進程會繼承父進程設置為SIG_DFLSIG_IGN的信號。對于捕獲后設置自定義處理函數的信號則不繼承這個處理函數。

二、代碼驗證

2.1 代碼編寫

此處針對exec的情況進行驗證,對于單純fork后的情況不進行說明。

  1. 編寫main.c。此處捕獲SIGCHLD自定義handle處理方式。當main函數執行后,將fork子進程,同時子進程會exec加載son可執行程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>void handler(int sig) {int status;int pid = waitpid(-1, &status, WNOHANG);if (pid > 0) {printf(">>>>>>>>>>>>>>>A child process has exited, pid: %d\n", pid);}
}int main() {// 設置信號處理函數signal(SIGCHLD, handler);pid_t pid = fork();if (pid == -1) {// fork失敗perror("fork");exit(EXIT_FAILURE);} else if (pid == 0) {// 子進程sleep(3);execlp("./son", "son", NULL);} else {// 父進程繼續執行,不等待子進程while(1) {printf("Parent process, PID: %d, son PID: %d\n", getpid(), pid);sleep(3);}}return 0;
}

執行 gcc main.c -o main 進行編譯

  1. 編寫son.c,調用fork創建孫子,孫子進程創建后會exec加載grandson可執行程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t pid = fork();if (pid == -1) {// fork失敗perror("fork");exit(EXIT_FAILURE);} else if (pid == 0) {// 子進程sleep(3);execlp("./grandson", "grandson", NULL);} else {// 父進程繼續執行,不等待子進程while(1) {printf("son process, PID: %d, grandson PID: %d\n", getpid(), pid);sleep(3);}}return 0;
}

執行 gcc son.c -o son 進行編譯

  1. 編寫grandson.c,代碼中定期輸出語句,類比執行業務代碼。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{while(1){printf("I am grandson, running!..., pid=%d\n", getpid());sleep(3);}return 0;
}

執行 gcc grandson.c -o grandson 進行編譯

2.2 代碼執行

輸入 ./main 執行程序,首先會觀察到有兩個 ./main程序,業務此時fork了
在這里插入圖片描述
三秒后500721號進程會執行exec,替換為son程序。son程序加載后會fork一次,故此時有兩個son進程
在這里插入圖片描述
三秒后500770號進程會執行exec,替換為grandson程序。此時有main,son和grandson進程存在
在這里插入圖片描述
當孫子進程退出時(執行kill -9殺死),它將會變為僵尸進程,因為它的父進程即son進程沒有調用wait,waitpid或忽略SIGCHLD信號
在這里插入圖片描述
結論:驗證了父進程捕獲信號后自定義處理邏輯,是不繼承到子進程的。

此外,當我們將main.c的signal(SIGCHLD, handler);替換為signal(SIGCHLD, SIG_IGN);后,按上述流程執行,殺死孫子進程時,現象如下:
在這里插入圖片描述
一旦執行殺死孫子進程,則ps檢測不到了,證明它被真正殺死,而不會陷入僵尸狀態。

結論:驗證了父進程忽略某個信號后,會繼承到子進程,子進程同樣忽略此信號。

三、linux源碼驗證

此處從源碼角度論證fork時子進程會繼承父進程的信號處理方式,包括父進程設置信號為SIG_DFLSIG_IGN或捕獲后設置自定義處理函數。
閱讀fork.c源碼可知:
copy_process函數調用copy_sighand函數&copy_signal函數

在這里插入圖片描述

  1. 信號處理函數的繼承:在copy_process函數中,當創建新進程(線程)時,如果clone_flags中設置了CLONE_SIGHAND,則共享信號處理函數。如果沒有設置,則會復制父進程的信號處理函數。這可以通過copy_sighand函數實現,該函數通過memcpy復制信號處理動作,即sig->action。
  2. 信號狀態的復制:在copy_signal函數中,如果clone_flags中沒有設置CLONE_THREAD,則會為新進程分配一個新的signal_struct結構體,并且復制父進程的信號限制和一些其他的信號狀態。

四、APUE中的驗證

  1. 本文的結論1為:fork時子進程會繼承父進程的信號處理方式,包括父進程設置信號為SIG_DFLSIG_IGN或捕獲后設置自定義處理函數。APUE對結論1的闡述如下:

在這里插入圖片描述

  1. 本文的結論2為:exce時子進程會繼承父進程設置為SIG_DFLSIG_IGN的信號。對于捕獲后設置自定義處理函數的信號則不繼承這個處理函數。APUE對結論2的闡述如下:

在這里插入圖片描述

五、其他

上文探究了fork和exec對信號的繼承情況,那么對于fd的繼承情況如何呢?有待后續探索…

ref:
https://www.cnblogs.com/yiyide266/p/13706799.html
《UNIX環境高級編程》

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

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

相關文章

ChatGPT寫作指南:掌握5種高效格式成為寫作達人【含實用示例】

1. **簡潔指令** 當任務較簡單時&#xff0c;可以用一小段話來說明&#xff0c;便于理解和執行。如下例&#xff1a; 背景&#xff1a;我負責運營一個旅游主題的社交媒體賬號。 角色&#xff1a;作為一位經驗豐富的文案創作專家&#xff0c;我擅長打造引人注目的旅游內容…

【無標題】亞馬遜5月24日宣布推出2024出口跨境物流加速器計劃

亞馬遜中國5月24日鄭重宣布啟動“2024亞馬遜出口跨境物流加速器計劃”&#xff0c;旨在依托其世界領先的物流網絡和前沿技術&#xff0c;結合本土資源&#xff0c;不斷優化跨境物流服務&#xff0c;以強化中國賣家在跨境物流供應鏈管理方面的能力&#xff0c;進而提升整體效率&…

datagridview復選框選中響應

winform經常用datagridview來處理相關的數據顯示&#xff0c;如果datagridview有復選框&#xff0c;我們應該如何處理相關選中響應。選擇datagridview的cellcontentclick事件&#xff0c;代碼如下&#xff1a; bool isSelectedGridViewRow false&#xff1b; private void da…

深度神經網絡——什么是 K 均值聚類?

K 均值聚類 K 均值聚類是 無監督學習在所有無監督學習算法中&#xff0c;K 均值聚類可能是使用最廣泛的&#xff0c;這要歸功于它的強大功能和簡單性。 K-means 聚類到底是如何工作的&#xff1f; 簡而言之&#xff0c;K 均值聚類的工作原理是 創建參考點&#xff08;質心&am…

Halcon 極坐標轉換圖像

一、概述 先看效果 將圓形的用極坐標轉換成矩性然后再進行識別或者其他缺陷檢測&#xff0c;最后在還圓到原圖中 二、原理&#xff1a; halcon 圓環類缺陷檢測的一種方法&#xff08;極坐標變換法&#xff09;_halcon缺口檢測-CSDN博客 圖像極坐標變換與反變換&#xff08;…

吳恩達深度學習筆記:超 參 數 調 試 、 Batch 正 則 化 和 程 序 框 架(Hyperparameter tuning)3.4-3.5

目錄 第二門課: 改善深層神經網絡&#xff1a;超參數調試、正 則 化 以 及 優 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第三周&#xff1a; 超 參 數 調 試 、 Batch 正 則 化 和 程 序 框 架&#xff08;Hyperparameter …

Spark SQL【Java API】

前言 之前對 Spark SQL 的影響一直停留在 DSL 語法上面&#xff0c;感覺可以用 SQL 表達的&#xff0c;沒有必要用 Java/Scala 去寫&#xff0c;但是面試一段時間后&#xff0c;發現不少公司還是在用 SparkSQL 的&#xff0c;京東也在使用 Spark On Hive 而不是我以為的 Hive O…

ubuntu20.04 開機自動掛載外加硬盤

文章目錄 一、問題描述二、操作1. 查找新添盤符2. 格式化硬盤文件系統3. 掛載硬盤4. 開機自動掛載5. 取消掛載6. 查看掛載的硬盤信息 一、問題描述 因電腦使用一段時間后自身硬盤不足&#xff0c;需外加硬盤使得電腦自動識別加載。 二、操作 1. 查找新添盤符 sudo blkid自己…

Linux基礎命令詳解

Linux基礎命令詳解 1. ls 解釋&#xff1a;列出目錄內容用法&#xff1a;ls [選項] [文件名]示例&#xff1a;ls -l&#xff08;以長格式顯示文件信息&#xff09; 2. cd 解釋&#xff1a;更改目錄用法&#xff1a;cd [目錄名]示例&#xff1a;cd /home&#xff08;切換到/…

# 全面解剖 消息中間件 RocketMQ-(3)

全面解剖 消息中間件 RocketMQ-&#xff08;3&#xff09; 一、RocketMQ – mqadmin 命令介紹 1、mqadmin 管理工具 使用方式 進入 RocketMQ 安裝位置&#xff0c;在 bin 目錄下執行 ./mqadmin {command} {args} # 進入 RocketMQ 安裝目錄的 bin 目錄下&#xff1a; cd /usr…

免費、開源、好用的 SQL 客戶端合集

免費、開源、好用的 SQL 客戶端合集 分類 編程技術 0、SQL Chat SQL Chat 是 2023 年 3 月推出的新型 SQL 客戶端&#xff0c;它將數據庫管理帶入了基于聊天的新時代。 SQL Chat 由 ChatGPT 驅動&#xff0c;能夠幫你編寫和潤色 SQL 語句&#xff0c;讓數據庫操作變得更加智…

微信小程序開發環境的搭建

一、注冊微信小程序賬號 二、安裝微信開發者工具 1.下載微信開發者工具。 官網下載地址&#xff1a;https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/downloads.html 2、選擇穩定版Window64下載安裝 3、下載完畢后&#xff0c;點擊下一步安裝 三、使用微信開發者工具…

SQLite查詢優化

文章目錄 1. 引言2. WHERE子句分析2.1. 索引項使用示例 3. BETWEEN優化4. OR優化4.1. 將OR連接的約束轉換為IN運算符4.2. 分別評估OR約束并取結果的并集 5. LIKE優化6. 跳躍掃描優化7. 連接7.1. 手動控制連接順序7.1.1. 使用 SQLITE_STAT 表手動控制查詢計劃 1. 引言 給定一個…

C# 特性(Attribute)超詳細教程

文章目錄 0.前篇1.特性概念2.特性的聲明和使用2.1 特性定義語法2.2 特性目標 3.預定義特性3.1 AttributeUsage3.2 Conditional3.3 其它預定義特性 4.MyAttributeHelper&#xff08;特性使用幫助類&#xff09;5.特性應用5.1 添加說明信息并獲取5.2 數據驗證 0.前篇 學習本文前…

聊聊Python中的文件讀寫操作

Python 中的文件讀寫操作是數據處理和存儲的基本操作之一。下面&#xff0c;我將詳細解釋如何在 Python 中進行文件的讀寫操作。 1. 打開文件 在 Python 中&#xff0c;使用 open() 函數來打開文件。這個函數需要至少一個參數&#xff0c;即文件名&#xff0c;并且返回一個文件…

數據結構和組成

數據結構組成 數據項&#xff1a;一個數據元素可以由若干數據項組成。 數據對象&#xff1a;有相同性質的數據元素的集合&#xff0c;是數據的子集。 數據結構&#xff1a;是相互之間存在一種或多種特定關系的數據元素的集合。 邏輯結構 數據對象中數據元素之間的相互關系 eg: …

深入理解python列表遍歷:兩種方法詳解與實例

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、引言 二、使用索引遍歷列表 三、直接使用元素遍歷列表 四、總結 一、引言 在編程過程…

創建python字典的兩種方法:直觀與函數式

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、直觀創建法&#xff1a;直接定義鍵值對 二、函數式創建法&#xff1a;使用內置函數dict…

CSRF 攻擊

概述 CSRF(Cross-site request forgery,跨站請求偽造)。 它是指攻擊者利用了用戶的身份信息&#xff0c;執行了用戶非本意的操作。 它首先引導用戶訪問一個危險網站&#xff0c;當用戶訪問網站后&#xff0c;網站會發送請求到被攻擊的站點&#xff0c;這次請求會攜帶用戶的c…

拼多多攜手中國農業大學,投建陜西佛坪山茱萸科技小院

5月16日下午&#xff0c;中國農業大學陜西佛坪山茱萸科技小院在佛坪縣銀廠溝村揭牌。佛坪縣素有“中國山茱萸之鄉”的美譽&#xff0c;是全國山茱萸三大基地之一&#xff0c;當地山茱萸是國家地理標志產品&#xff0c;山茱萸肉產量位居全國第二。 為充分發揮佛坪縣得天獨厚的山…