system函數和signal(SIGCHLD, SIG_DFL)的“固定搭配”

背景知識:

子進程先于父進程結束時,會給父進程發送SIGCHLD信號

如果
??????????????????????????????????????????????????????????????????? 1、父進程沒有忽略SGICHLD信號;
???????????????????????????????????????????????????????????????????? 或者
??????????????????????????????????????????????????????????????????? ?2、父進程沒有調用wait或waitpid函數。
????????????????????????????????????????????????????????? 那么子進程將僵死。

?????????????????????????????????????????????????????????

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (

????????????????????????????????????????????????????????????????在2.6內核只要父進程顯式忽略了SIGCHLD信號,

????????????????????????????????????????????????????????????????那么子進程將不會僵死,那么system將得不到子進程的退出狀態。

???????????????????????????????????????????????????????????????? 也就是說system函數的返回值并不是子進程退出時的狀態。

?

?????????????????????????????????????????????????????????????????而2.4內核,只要父進程沒有調用wait系列函數,子進程就將僵死。
?????????????????????????????????????????????????????????????????????????????????????不論是否忽略了SIGCHLD信號

????????????????????????????????????????????????????????? )

如果,我們在我們的server中需要調用system來調用外部腳本程序來執行某寫工作。

?

????????int?? ret?? =??? system(command);????

??????? if( ret?== 0)

??????? {

????????????????????????????? //成功

????????}??

??????? else

???????? {

???????????????????????????? //失敗

???????? }

?

其中ret用來接收子進程退出是的返回值。即exit的返回值。

????????但是由于在deamon中忽略了SIGCHLD信號,所以主進程將不再接收子進程的返回值。所以,ret的值不能正確反映子進程的退出狀態

?

????????正確的做法是::

? ? ? ? ? ? ? ? sighandler_t old_handler;

????????????????old_handler?=?signal(SIGCHLD,SIG_DFL);??????????????? //為了準確地獲取 system 函數的返回值,不能顯式(SIG_IGN)地忽略 SIGCHLD 信號

??????????????? system(command);? ? ? ? ? ? //system 函數:1.fork一個進程;2.在子進程中調用 exec() 去執行新程序;3.在父進程中調用 waitpid 去等待子進程結束

??????????????? signal(SIGCHLD,old_handler);? ? ? ? //old_handler?記錄了之前對于 SIGCHLD 信號的處理方式,現在還原回去

?

2、system相關問題::

???????? system函數其實是調用fork,exec,waitpid來實現的。

????? ????????1、fork一個進程;

??????????????2、在子進程中調用exec去執行新程序。

????????????? 3、在父進程中調用waitpid去等待子進程結束。

?????? 如果在父進程已經signal(SIGCHLD,SIG_IGN);那么子進程結束時,子進程的返回值不能被waitpid接收。

?????? 這個是必須關注的問題。

原文地址:http://www.360doc.com/content/14/0305/09/13084517_357841525.shtml

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

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

相關文章

信號量釋放和等待函數sem_post()和sem_wait()

信號量: 信號量是IPC結構中的一種,是進程間通信的一種方法,也可以解決同一進程不同線程之間的通信問題。它是用來保證兩個或多個關鍵代碼段不被并發調用,防止多個進程同時對共享資源進行操作。 原理: 在進入一個關鍵代…

信號量sem_init,sem_wait,sem_post

https://youth.blog.csdn.net/article/details/78318932?utm_mediumdistribute.pc_relevant.none-task-blog-OPENSEARCH-1.control&dist_request_id&depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-OPENSEARCH-1.control

QT的foreach用法

https://blog.csdn.net/qq_35488967/article/details/54602752 https://blog.csdn.net/xiaolong361/article/details/89417527

Linux信號之signal函數

1. 信號概述 何為信號:信號就是由用戶、系統或進程發送給目標進程的信息,以通知目標進程中某個狀態的改變或是異常。 信號產生:總體來說,其產生的條件有兩種,分別是:硬件和軟件原因,又稱為&…

Linux pause函數 詳解

int pause(void);   作用&#xff1a;使調用進程&#xff08;線程&#xff09;進入休眠狀態&#xff08;就是掛起&#xff09;&#xff1b;直到接收到信號且信號函數成功返回 pause函數才會返回   返回值&#xff1a;始終返回-1  示例代碼: #include <sys/types.h>…

Linux中wait()函數及waitpid()函數

編程過程中&#xff0c;有時需要讓一個進程等待另一個進程&#xff0c;最常見的是父進程等待自己的子進程&#xff0c;或者父進程回收自己的子進程資源包括僵尸進程。這里簡單介紹一下系統調用函數&#xff1a;wait() 函數原型是 #include <sys/types.h> #include <…

Linux下Kill函數用法

&#xff3b; KILL &#xff3d;功能描述&#xff1a; 用于向任何進程組或進程發送信號。 頭文件用法&#xff1a; 1 #include < sys / types.h > 2 3 #include < signal.h > 4 5 int kill(pid_t pid, int sig); 6 7 參數&#xff1a; pid&#xff1…

學習筆記 --- DM9000網卡原理與基地址設置

前面有文章分析了網卡也是屬于類內存總線的設備&#xff0c;類內存總線的設備有地址總線和數據總線&#xff0c;先來看下DM9000的管腳&#xff1a; 從上面可以看出DM9000的地址總線就一根&#xff0c;它不像CS8900那樣地址總線和數據總線都齊全。而這里只有一根地址線(CMD)&…

Micrium/UCOS官網賬號密碼重新改問題

https://blog.csdn.net/qq_42312125/article/details/104122502

靜態VLAN的配置

在一臺交換機上連接3臺PC機&#xff0c;然后創建兩個VLAN&#xff0c;分別為VLAN 10 和VLAN 20&#xff0c;把第一臺PC機分配給VLAN 10&#xff0c;把其他兩臺分配給VLAN 20.然后測試他們的互通情況。 在這里命令我用的都是簡化命令&#xff0c;想卡完整版命令&#xff0c;請到…

靜態路由原理

1、路由器的工作原理 路由工作簡單原理圖 1&#xff09;主機1.1要發生數據包給主機4.1.因為IP地址不在同一網段&#xff0c;所以主機會將數據包發送給本網段的網關路由器。 2&#xff09;路由器A 接收到數據包&#xff0c;先查看數據包IP首部中的目標IP地址。再查找自己的路由表…

靜態路由和默認路由

一、靜態路由的配置 下邊實驗對該拓撲圖進行配置 實驗目標&#xff1a;配置靜態路由&#xff0c;實現全網互通 1、配置路由器R1 進入接口f0/0&#xff0c;配置IP&#xff0c;并開啟。 進入接口f0/1&#xff0c;配置IP&#xff0c;并開啟。 設置靜態路由。 查看PC1的路由表 2、配…

IP地址192.168.1.1/24中的/24是什么意思

/24是指子網掩碼的位數。 子網掩碼的位數總共有32個&#xff0c;寫的的/24個就是24個1&#xff0c;其它8位都是0。 /24就可以寫成子網掩碼是&#xff1a;11111111 11111111 11111111 00000000 例如&#xff1a; /25&#xff0c;就代表有25個1&#xff0c;7個0&#xff0c;…

VLAN與子網劃分區別

轉自&#xff1a;http://bbs.51cto.com/thread-1514066-1.html 經常看到論壇里有新手上來發貼說已經弄了VLAN了&#xff0c;為什么還要劃分IP子網的問題。今天詳細講一下。 VLAN與IP子網&#xff08;劃分&#xff09;的區別。有點類似于重量和質量的區別: 重量的的單位是牛頓&…

IP地址中A類、B類、C類地址的區別

區別如下&#xff1a; 1、IP地址表示方法不同&#xff1a; 一個A類IP地址是指&#xff0c; 在IP地址的四段號碼中&#xff0c;第一段號碼為網絡號碼&#xff0c;剩下的三段號碼為本地計算機的號碼。如果用二進制表示IP地址的話&#xff0c;A類IP地址就由1字節的網絡地址和3字…

原始套接字簡介

一 原始套接字概述 原始套接字&#xff0c;指在傳輸層下面使用的套接字。流式套接字和數據報套接字這兩種套接字工作在傳輸層&#xff0c;主要為應用層的應用程序提供服務&#xff0c;并且在接收和發送時只能操作數據部分&#xff0c;而不能對IP首部或TCP和UDP首部進行操作&am…

原始socket例子

https://blog.csdn.net/qq_35426012/article/details/98858401 https://blog.51cto.com/u_13603157/2095503

Ucosii消息郵箱使用

https://blog.csdn.net/oyhb_1992/article/details/75270739 https://www.cnblogs.com/itloverhpu/p/3139511.html

ucosii中消息隊列、消息郵箱、信號量的區別

1、用信號量進行行為同步時&#xff0c;只能提供同步的時刻信息&#xff0c;不能提供內容信息。若被控制方要求得到控制方的內容信息時&#xff0c;可以使用消息郵箱或消息隊列。 2、但由于消息郵箱里只能存放一條消息&#xff0c;所以使用消息郵箱進行任務的同步時&#xff0c…