linux進程通信---幾個發送信號的函數(kill,raise,alarm,pause)

http://blog.csdn.net/zzyoucan/article/details/9235685

信號:信號是unix中最古老的進程通信的一種方式,他是軟件層次上對中斷機制的模擬,是一種異步通信方式,信號可以實現用戶空間進程和內核空間進程的交互,內核進程可以利用他通知用戶空間進程發生了哪些系統事件,我們可以任何時候給進程發送信號而無需知道進程的狀態,如果進程當前并未處于執行態,則信號則會由內核保存起來,如果進程是阻塞狀態,那么信號傳遞會被延遲,直到阻塞結束時才會傳遞給進程。

看一下kill -l列出的各種命令:

會發現一個規律,前32種信號會有各種不同的名稱,后32種會以“SIGRTMIN”或者“SIGRTMAX”開頭,前者是從unix繼承下來的信號,稱為不可靠信號(也稱為非實時信號),后者為了解決“不可靠信號”的問題進行了更改和擴充的信號形成了可靠信號(也稱為實時信號)

如果想要了解可靠與不可靠信號,需要了解信號的生命周期:

一個完整的信號周期可以分為三個重要階段,三個重要階段有四個重要事件刻畫的:信號產生,信號在進程中注冊,信號在進程中注銷,執行信號處理函數

信號處理周期:

相鄰的兩個事件的時間間隔構成了生命周期的一個階段,這里的信號處理有多種方式,一般由內核完成,也可以由用戶進程完成

可靠信號與不可靠信號的區別:

不可靠信號如果發現信號已經在進程中注冊,就會忽略該信號,因此若前一個信號還沒有注銷又產生了新的信號就是導致信號丟失

可靠信號發送給一個進程時,不管該信號是否已經在進程中注冊,都會被再注冊一次,因此信號不會丟失,所有可靠信號都支持排隊,所有不可靠信號都不支持排隊。

ps:這里信號的產生,注冊,注銷等是指信號的內部的實現機制,而不是調用信號的函數實現,所以信號注冊與否,與本節后面講到的發送信號函數(kill等)以及信號安裝函數(signal()等)無關只與信號值有關

用戶進程對信號的響應有三種方式:

  1. 忽略信號,對信號不做任何處理,但是又兩個信號是不能忽略的,即SIGKILL,SIGSTOP
  2. 捕捉信號,定義信號處理函數,當信號發送時,執行相應的自定義處理函數
  3. 執行缺省操作,linux對每種信號都規定了默認操作

linux中大多數信號是提供給內核的,下面列出了最為常見的信號的含義及其默認操作:

發送信號的函數主要有kill(),raise(),alarm(),pause()

(1)kill()和raise()

kill()函數和熟知的kill系統命令一樣,可以發送信號給信號和進程組(實際上kill系統命令只是kill函數的一個用戶接口),需要注意的是他不僅可以終止進程(發送SIGKILL信號),也可以向進程發送其他信號。

與kill函數不同的是raise()函數允許進程向自身發送信號。

(2)函數格式:

kill函數的語法格式:

raise()函數語法要點:

下面的例子使子進程不在父進程調用kill之前不退出,然后父進程調用kill使子進程退出:

[cpp]?view plain?copy
  1. #include?<stdio.h>??
  2. #include?<stdlib.h>??
  3. #include?<signal.h>??
  4. #include?<sys/types.h>??
  5. #include?<sys/wait.h>??
  6. int?main()??
  7. {??
  8. ????pid_t?pid?;??
  9. ????int?ret?;??
  10. ????if?((pid?=?fork())?<?0)??
  11. ????{??
  12. ????????printf("fork?error\n")?;??
  13. ????????exit(1)?;??
  14. ????}??
  15. ????else?if?(pid?==?0)??
  16. ????{??
  17. ????????printf("child(pid:%d)id?waiting?for?any?signal\n",?getpid())?;??
  18. ????????raise(SIGSTOP)?;//子進程暫停??
  19. ????????exit(0)?;??
  20. ????}??
  21. ????else??
  22. ????{??
  23. ????????????//獲取到pid子進程沒有退出,指定WNOHANG不會阻塞,沒有退出會返回0??
  24. ????????if?((waitpid(pid,?NULL,?WNOHANG))?==?0)??
  25. ????????{??
  26. ????????????if?((ret?=?kill(pid,?SIGKILL))?==?0)//向子進程發出SIGKILL信號??
  27. ????????????{??
  28. ?????????????????printf("parent?kill?%d\n",?pid)?;??
  29. ????????????}??
  30. ????????}??
  31. ????????waitpid(pid,?NULL,?0)?;//等待子進程退出,是阻塞函數如同wait()??
  32. ????????exit(0)?;??
  33. ????}??
  34. }??
程序運行結果如下:

看出父進程kill掉了子進程

(3)alarm()和pause()

alarm()-----也稱為鬧鐘函數,可以在進程中設置一個定時器,等到時間到達時,就會想進程發送SIGALARM信號,注意的是一個進程只能有一個鬧鐘時間,如果調用alarm()之前已經設置了鬧鐘時間,那么任何以前的鬧鐘時間都會被新值所代替

pause()----此函數用于將進程掛起直到捕捉到信號為止,這個函數很常用,通常用于判斷信號是否已到

alarm()函數語法:

pause()函數語法如下:

下面的一個實例實現了sleep()函數的功能

[cpp]?view plain?copy
  1. #include?<unistd.h>??
  2. #include?<stdio.h>??
  3. #include?<stdlib.h>??
  4. int?main()??
  5. {??
  6. ????int?ret?=?alarm(5)?;//設置一個定時器??
  7. ????pause()?;//捕捉定時器信號??
  8. ????printf("I?have?been?waken?up\n",?ret)?;??
  9. }??
  10. ~??????????????
執行程序會在5秒之后出現:


這個函數中的printf是不會執行的,因為定時器發送的SIGARAM的默認處理是終止程序,所以程序打印之前程序已經結束了,與sleep不同的是sleep是不會退出的。



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

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

相關文章

數據庫以及表的基本操作

一.數據庫的操作 create database[if not exists]數據庫名; 創建一個名字為company2的使用utf8忽略大小寫的數據庫 create database company charsetutf8 collate utf8_general_ci; 創建一個數據庫區分大小寫 create database company1 charsetutf8 collate utf8_general_bin;…

linux 網絡編程:使用兩線程實現socket同時收發數據

http://blog.csdn.net/li_wen01/article/details/52665505 工作中最近有使用到socket 向客戶端同時發送和接收數據&#xff0c;因為是嵌入式linux設備&#xff0c;且要求只能同時一個客戶端連接該端口。考慮到節省系統資源&#xff0c;只創建了兩個線程分別實現服務端的收發數據…

CF Gym102059 H. Fractions

題目要求找到給定區間的化簡后分子分母的和小于1000的數字的個數 我的想法是先找到所有的滿足要求的最簡分數(總數不超過1e6,而且遠小于),然后對詢問查找每個最簡分數出現的次數. #include<cstdio> #include<cstring> #include<algorithm> #include<cli…

C語言calloc()函數:分配內存空間并初始化

http://c.biancheng.net/cpp/html/134.html 頭文件&#xff1a;#include <stdlib.h> calloc() 函數用來動態地分配內存空間并初始化為 0&#xff0c;其原型為&#xff1a; void* calloc (size_t num, size_t size); calloc() 在內存中動態地分配 num 個長度為 siz…

CF Gym100917 C

要找到和為給定值的所有的等比數列. 1肯定是要特判一下. 我的想法是先找到所有等比為1的,等比為1就是將這個數分為相同的一些數,總共就是這個數的所有約數個數減一(有一個約數為1,題目要求至少分成兩個數). 對于其他的等比不為1 的,用等比數列的求和公式暴力一發就行了. #i…

多路轉接select1

高級IO 通常情況下所有的 IO 都可以分為兩步來完成, 第一步等待, 第二步數據搬遷, 為了提高 IO 效率通常所運用的方法就是減少等待的時間 舉個釣魚的例子 現在有五個人張三, 李四, 王五, 趙六, 錢七. 它們五個人來到湖邊來釣魚. 而它們五個人的釣魚方各不相同. 張三釣魚方法…

UVa11181

題目要求條件概率,用貝葉斯公式我們很容易得到我們需要求r個人買東西的概率和每個人買東西的條件下其他r-1個人買東西的概率.我們遞歸枚舉,每當枚舉到r個人買東西的時候,我們加入到r個人買東西的概率中(全概率公式),然后對于這r個人,除去自己買東西的概率就是其他r-1個人買東西…

Linux epoll模型

http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html 定義&#xff1a; epoll是Linux內核為處理大批句柄而作改進的poll&#xff0c;是Linux下多路復用IO接口select/poll的增強版本&#xff0c;它能顯著的減少程序在大量并發連接中只有少量活躍的情況下的系統CPU利…

UVa11572

書上把這種問題叫做滑動窗口問題. 我的想法是先進行離散化,然后用一個數組記錄元素出現的位置,如果判斷某個元素已經出現,就將左端點移到上次出現的位置的后面.每次出現重復元素的時候判斷一下答案.我覺得這樣的復雜度是最低的. #include<cstdio> #include<cstring&…

Linux IO模式及 select、poll、epoll詳解

https://segmentfault.com/a/1190000003063859 同步IO和異步IO&#xff0c;阻塞IO和非阻塞IO分別是什么&#xff0c;到底有什么區別&#xff1f;不同的人在不同的上下文下給出的答案是不同的。所以先限定一下本文的上下文。 本文討論的背景是Linux環境下的network IO。一 概念…

mysql思維導圖

后期會不斷進行更新

CF Gym 101630 B Box

題目的意思大概就是給一個長方體的長寬高,問他能不能用一個w*h的紙剪出來,就是說展開圖的長寬能不能比給定的小. 題目給了11中展開圖的拓撲結構,我覺得這個很關鍵,要是題目沒有給這個我可能想不到那么全面,不過題目已經給了我就分析那11個圖形,發現展開圖的長寬大概分為三類 …

C++第一節課

C數據類型 幾個概念 命名空間是C標準庫引入的,其中命名空間可以解決變量沖突問題,當出現局部變量和全局變量同名的時候, 局部變量優先被訪問.同時命名空間的格式如同一下代碼 namespace name1 { int a 0; }namespace name2 { int a 2; } 注意C中的所有組件都是在一個叫做s…

【C/C++】關鍵字static

http://blog.csdn.net/woxiaohahaa/article/details/51014224 參考自&#xff1a;http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html &#xff08;華山大師兄&#xff09; 這里我們只討論了C語言的static 首先我們回顧一下各種變量在內存中的位置&#xff1…

HDU5391威爾遜定理

威爾遜定理 當且僅當p為素數,p | (p-1)!1 若p為合數,則pa*b;如果a!b,那么p|(p-1)!, 如果ab,如果p為4,那么p|(p-1)!2,如果p大于4,那么sqrt和sqrt(2q)肯定屬于(p-1)!中,可以整除 #include<cstdio> #include<cstring> #include<algorithm> #include<climit…

C++的基本認識

簡單介紹C 語言特點 支持數據封裝和數據隱藏 在C中&#xff0c;類是支持數據封裝的工具&#xff0c;對象則是數據封裝的實現。C通過建立用戶定義類支持數據封裝和數據隱藏。 在面向對象的程序設計中&#xff0c;將數據和對該數據進行合法操作的函數封裝在一起作為一個類的定…

OD 投籃大賽

/*** 題目描述* 你現在是一場采用特殊賽制投籃大賽的記錄員。這場比賽由若干回合組成&#xff0c;過去幾回合的得分可能會影響以后幾回合的得分。* 比賽開始時&#xff0c;記錄時空白的。你會得到一個記錄操作的字符串列表aops&#xff0c;其中ops[i]是你需要記錄的第i項操作&a…

IO多路復用之epoll總結

http://www.cnblogs.com/Anker/p/3263780.html 1、基本知識 epoll是在2.6內核中提出的&#xff0c;是之前的select和poll的增強版本。相對于select和poll來說&#xff0c;epoll更加靈活&#xff0c;沒有描述符限制。epoll使用一個文件描述符管理多個描述符&#xff0c;將用戶關…

2018南京區域賽 J-Prime Game

完全沒有頭緒 聽完隊友講的我還是楞了好半天菜慢慢理解.我好菜啊 首先要弄懂題目的意思,轉換一下題意就是求每個素因子出現區間的次數.區間長度最短為1.我們分析,第一個數的因子會影響1* n個區間(暫時不考慮重復),第二個數的因子會影響2 * (n-1)個區間,以此類推.因此我們只需要…

3_V1-類和對象 -- 默認成員函數

定義一個日期類 #include <iostream> #include <assert.h> using namespace std;class Date { public:void Display(); private:int _year;int _month;int _day; }; 注意: 在定義一個類的時候往往會將其成員變量定義為私有,成員函數定義為公有.這是為了達到軟件…