信號

来源:http://www.cnblogs.com/Lynn-Zhang/archive/2016/07/17/5677118.html
-Advertisement-
Play Games

信號的基本概念: 每個信號都有一個編號和一個巨集定義名稱 ,這些巨集定義可以在 signal.h 中找到。 使用kill -l命令查看系統中定義的信號列表: 1-31是普通信號; 34-64是實時信號 所有的信號都由操作系統來發! 對信號的三種處理方式:忽略信號、直接執行進程對於該信號的預設動作、執行自 ...


信號的基本概念: 每個信號都有一個編號和一個巨集定義名稱 ,這些巨集定義可以在 signal.h 中找到。 使用kill -l命令查看系統中定義的信號列表: 1-31是普通信號; 34-64是實時信號  所有的信號都由操作系統來發! 對信號的三種處理方式:忽略信號、直接執行進程對於該信號的預設動作、執行自定義動作;

產生信號的條件:

1.用戶在終端按下某些鍵時,終端驅動程式會發送信號給前臺程式。      例如:Ctrl-c產生SIGINT信號,Ctrl-\產生SIGQUIT信號,Ctrl-z產生SIGTSTP信號 2.硬體異常產生信號。      這類信號由硬體檢測到並通知內核,然後內核向當前進程發送適當的信號。      例如:當前進程執行除以0的指令,CPU的運算單元會產生異常,內核將這個進程解釋為SIGFPE信號發送給當前進程。                當前進程訪問了非法記憶體地址,MMU會產生異常,內核將這個異常解釋為SIGSEGV信號發送給進程。 3.一個進程調用kill(2)函數可以發送信號給另一個進程。      可以用kill(1)命令發送信號給某個進程,kill(1)命令也是調用kill(2)函數實現的,如果不明確指定信號則發送SIGTERM信號,該信號的預設處理動作是終止進程。   信號 的產生: 1.通過終端按鍵產生信號 舉個慄子:寫一個死迴圈,前臺運行這個程式,然後在終端鍵入Ctrl-c   當CPU正在執行這個進程的代碼 , 終端驅動程式發送了一 個 SIGINT 信號給該進程,記錄在該進程的 PCB中,則該進程的用戶空間代碼暫停執行 ,CPU從用戶態 切換到內核態處理硬體中斷。   從內核態回到用戶態之前, 會先處理 PCB中記錄的信號 ,發現有一個 SIGINT 信號待處理, 而這個信號的預設處理動作是終止進程,所以直接終止進程而不再返回它的用戶空間代碼執行。  2.調用系統函數向進程發信號
/*************************************************************************
 > File Name: test.c
 > Author:Lynn-Zhang
 > Mail: [email protected]
 > Created Time: Fri 15 Jul 2016 03:03:57 PM CST
 ************************************************************************/
 
#include<stdio.h>
int main()
{
    printf("get pid :%d circle ...\n",getpid());
    while(1);
    return 0;
}
寫一個上面的程式在後臺執行死迴圈,並獲取該進程的id,然後用kill命令給它發送SIGSEGV信號,可以使進程終止。也可以使用kill -11 5796,11是信號SIGSEGV的編號。    

kill命令是調用kill函數實現的。kill函數可以給一個指定的進程發送指定信號。

raise函數可 以給當前進程發送指定的信號 (自己給自己發信號 )

#include<signal.h>
int kill(pid_t pid,int signo);
int raise(int signo);
這兩個函數都是成功返回0,錯誤返回-1. 除此之外,abort函數使當前進程接收到SIGABRT信號而異常終止。
#include<stdlib.h>
void abort(void);
就像 exit函數一樣 ,abort 函數總是會成功的 ,所以沒有返回值。 3.由軟體條件產生信號
/*************************************************************************
 > File Name: alarm.c
 > Author:Lynn-Zhang
 > Mail: [email protected]
 > Created Time: Fri 15 Jul 2016 08:52:02 PM CST
 ************************************************************************/

#include<stdio.h>

int main()
{
    int count=0;
    alarm(1);
    while(1)
    {
        printf("%d\n",count);
        count++;
    }
    return 0;
}

 通過實現以上代碼,調用alarm函數可以設定一個鬧鐘,告訴內核在seconds秒之後給當前進程發SIGALRM信號, 該信號的預設處理動作是終止當前進程。

   該程式會在1秒鐘之內不停地數數,並列印計數器,1秒鐘到了就被SIGALRM信號終止。由於電腦配置等的不同,每臺電腦一秒鐘之內計數值是不同的一般是不同的。

#include <unistd.h>
unsigned int alarm(unsigned int seconds);

  alarm函數的返回值是0或上次設置鬧鐘剩餘的時間。

 阻塞信號:

 1.信號在內核中的表示:

信號遞達delivery:實際執行信號處理信號的動作 信號未決pending:信號從產生到抵達之間的狀態,信號產生了但是未處理 忽略:抵達之後的一種 動作 阻塞block:收到信號不立即處理     被阻塞的信號將保持未決狀態,直到進程解除對此信號的阻塞,才執行抵達動作   信號產生和阻塞沒有直接關係 抵達和解除阻塞沒有直接關係! 進程收到一個信號後,不會立即處理,它會在恰當的時機被處理。

 

每個信號都由兩個標誌位分別表示阻塞和未決,以及一個函數指針表示信號的處理動作。

在上圖的例子中,

1. SIGHUP信號未阻塞也未產生過,當它遞達時執行預設處理動作。
2. SIGINT信號產生過,但正在被阻塞,所以暫時不能遞達。雖然它的處理動作是忽略,但在沒 有解除阻塞之前不能忽略這個信號,因為進程仍有機會改變處理動作之後再解除阻
塞。
3. SIGQUIT信號未產生過,一旦產生SIGQUIT信號將被阻塞,它的處理動作是用戶自定義函數sighandler。
阻塞信號集也叫作信號屏蔽字。

2.信號集操作函數

#include <signal.h>
int sigemptyset(sigset_t *set);      //初始化set所指向的信號集,使所有信號的對應位清0
int sigfillset(sigset_t *set);       //初始化set所指向的信號集,表示該信號集的有效信號包括系統支持的所有信號
int sigaddset(sigset_t *set, int signo);   //在該信號集中添加有效信號
int sigdelset(sigset_t *set, int signo);    //在該信號集中刪除有效信號
int sigismember(const sigset_t *set, int signo);   //⽤用於判斷一個信號集的有效信號中是否包含某種信號

3.調用函數sigprocmask可以讀取或更改進程的信號屏蔽字(阻塞信號集)。

#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);

 如果調用sigprocmask解除了對當前若幹個未決信號的阻塞,則在sigprocmask返回前,至少將其中 一個信號遞達。

4. sigpending讀取當前進程的未決信號集,通過set參數傳出

#include <signal.h>
int sigpending(sigset_t *set);

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mv命令 mv命令是move的縮寫,可以用來移動文件或者將文件改名(move (rename) files),是Linux系統下常用的命令,經常用來備份文件或者目錄。1.命令格式: mv [選項] 源文件或目錄 目標文件或目錄2.命令功能:視mv命令中第二個參數類型的不同(是目標文件還是目標目錄), ...
  • rmdir命令 rmdir是常用的命令,該命令的功能是刪除空目錄,一個目錄被刪除之前必須是空的。(註意,rm - r dir命令可代替rmdir,但是有很大危險性。)刪除某目錄時也必須具有對父目錄的寫許可權。1.命令格式:rmdir [選項]... 目錄...2.命令功能:該命令從一個目錄中刪除一個或 ...
  • linux中刪除文件和目錄的命令: rm命令。rm是常用的命令,該命令的功能為刪除一個目錄中的一個或多個文件或目錄,它也可以將某個目錄及其下的所有文件及子目錄均刪除。對於鏈接文件,只是刪除了鏈接,原有文件均保持不變。rm是一個危險的命令,使用的時候要特別當心,尤其對於新手,否則整個系統就會毀在這個命 ...
  • Centos vsftpd伺服器搭建 時間:2016-07-18 1.最為簡單的vsftpd伺服器搭建 1.安裝vsftpd 1.yum 安裝 2.rpm文件安裝(如果沒有rpm文件,可以到http://rpmfind.net/網站下載) 2.防火牆(centos 6.5 使用的是iptables防 ...
  • linux mkdir 命令 用來創建指定的名稱的目錄,要求創建目錄的用戶在當前目錄中具有寫許可權,並且指定的目錄名不能是當前目錄中已有的目錄。1.命令格式:mkdir [選項] 目錄...2.命令功能:通過 mkdir 命令可以實現在指定位置創建以 DirName(指定的文件名)命名的文件夾或目錄。 ...
  • Linux中用 pwd 命令來查看”當前工作目錄“的完整路徑。 簡單得說,每當你在終端進行操作時,你都會有一個當前工作目錄。 在不太確定當前位置時,就會使用pwd來判定當前目錄在文件系統內的確切位置。1.命令格式: pwd [選項]2.命令功能: 查看”當前工作目錄“的完整路徑3.常用參數:一般情況 ...
  • 安裝mysql 使用yum命令進行下載mysql軟體,安裝是要root的許可權,su這個命令可以獲得許可權。 [root@centos6 administrator]# yum install mysql-server 跟系統一起啟動命令: chkconfig –levels 235 mysqld on ...
  • 作為碼農怎麼能不用谷歌呢? 我來做下shadowsocks服務的搭建。 Shadowsocks使用socks5代理,用於保護網路流量。在中國大陸被廣泛用於突破防火長城(GFW),以瀏覽被封鎖的內容。 Shadowsocks分為伺服器端和客戶端。在使用之前,需要先將伺服器端部署在支持Python的服務 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...