[Linux]信號

Linux下的信號是一個什么概念呢。我們在現實生活中也遇到過信號之類的。比如紅綠信號燈,班主任叫你去辦公室并且臉色不好,諸如此類的都會給你一個信號。讓你辨別事情的發生。同樣,Linux下也有許多的信號,讓你執行相應的操作。比如我們經常使用的ctrl + c,ctrl + z,ctrl + d等,想結束掉當前的進程,我們通常使用ctrl + c,但是ctrl+c只適用于前臺進程,如果是切換到后臺進程的話,ctrl+c就終止不了。

我們寫了一個死循環的輸出“hello world”的例子,當我們使用ctrl+c的時候,相當于觸發了2號信號來中斷進程,當我們把它放到后臺運行的時候,使用ctrl+c根本不管用。因為它信號只能對前臺進程這樣操作。

這里寫圖片描述

那么我們怎么終止它呢。這些信號里邊有特殊的信號是可以終止后臺進程的,9號信號(SIGKILL),這就是kill信號的強大之處。(如果所有的進程都放在后臺,且都終止不了,那操作系統不得掛掉啊^_^哈哈)當然不只是9號信號可以對后臺進程操作,還有些也可以。只是9號信號大家經常用到。所以就多說幾句哈。(這里還要強調的一點是,shell不僅可以運行一個前臺進程,還可以運行任意多個后臺進程)

這里寫圖片描述

比如:

通過命令Kill -l,可以查看信號:

這里寫圖片描述

以上就是62個信號,其中1-31為普通信號,34-64為實時信號。

上面說了1-31號為普通信號,那么它可以用什么來表示呢。1和31這個敏感的數字,我們可以想到什么呢。是不是可以想到位圖。32個比特位,每一位表示一個信號存在或者不存在。這樣的話就只需要4個字節(也即一個整數)就可以存放這些信號了。

信號的處理動作主要有:

1.忽略該信號
2.執行該信號的默認處理動作
3.捕捉信號(自定義動作,自己定義的一些信號處理函數)
對于捕捉自定義信號,舉個栗子哈:

這里寫圖片描述

當我們觸發到2號信號時,我們就會執行自定義的信號處理函數,會打印出pid和sig值。而不再是終止進程。
結果如下:

這里寫圖片描述

小姿勢(哈哈):

信號具有異步的特點,主要體現在任何一個時刻都可能產生信號。

那么話題又來了,產生信號的條件有哪些呢?

(1)像剛剛產生的信號,是用鍵盤產生的。鍵盤按ctrl+c,ctrl+z,ctrl+d等等。

(2)還有可能是因為某一個異常觸發了某一個信號導致的。

這里寫圖片描述

比如上述這個題目,本來除數不能為0,這里讓被除數除以一個為0的數,此時就會拋出異常。

這里寫圖片描述

這里的這個異常就是段錯誤所導致的。

(3)由于系統調用接口產生信號。系統調用接口,主要有以下幾種:

1.自己寫一個kill函數,來調用kill函數或者直接調用系統的kill函數使其產生9號信號。
系統的killint kill(pid_t pid,int sig);
2.調用raise函數,自己給自己發信號。
3.調用abort函數,像exit一樣,觸發捕捉信號后終止進程。

1.kill函數(成功返回0,錯誤返回-1)

這里寫圖片描述

運行結果為:運行完5個hello world之后,將執行2號信號,因此進程退出。

這里寫圖片描述

在這里,如何自己定義一個mykill函數呢。

這里寫圖片描述

它會檢測你命令行上輸入的命令,如果錯誤,將會給你顯示出kill的正確用法。

這里寫圖片描述

上述用法錯誤,給你提示了。

比如先啟動一個進程:(本身是死循環)

這里寫圖片描述

然后我們將其殺死:(通過獲取進程號,這樣就模擬了系統的kill函數)

這里寫圖片描述

2.使用raise函數(成功返回0,錯誤返回-1)

這里寫圖片描述

此時,結果與上述一樣,只是raise為自己給自己發送2號信號。

這里寫圖片描述

3.使用abort函數(函數總會成功,所以沒有返回值)

這里寫圖片描述

運行結果為:

這里寫圖片描述

(4)通過軟件觸發產生信號。主要使用alarm函數來觸發SIGALRM信號。

unsigned int alarm(unsigned int seconds);
參數為秒數,多少秒之后觸發SIGALRM信號。

這里寫圖片描述

這個例子當3秒之后觸發alarm信號,終止進程

這里寫圖片描述

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

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

相關文章

怎么用VLC播放器將m3u8鏈接視頻下載到本地

轉載 https://blog.csdn.net/saddyyun/article/details/85245135

【1】C++面試題函數引用重載宏命名空間

函數重載的條件 ? 同一個名字 ? 函數名字相同 ? 參數列表不同 ? 同一個作用域 為什么c支持函數重載而c不支持? c函數名字的修飾規則不一樣。c編譯器對函數修飾規則把int的參數列表形式加了進來,從而保證底層使用不同 cAdd(int a,int b)_AddcA…

[數據結構]Map和Set

說起map和set,想必我們都學過紅黑樹了吧,map和set就是紅黑樹的一個應用領域。它的底層就是由紅黑樹來實現的。下面簡單說一下map和set的使用吧。 首先,有一個栗子是這樣的,讓我們統計出每種水果出現的次數。 我們會想到怎么解決…

js獲取Json對象的長度

有兩種Json形式: 第一種: var json1 {"data":[{"name":"zs","age":"10"}]};對于這種格式的json數據,如果想獲取data的長度,就可以用以下這種方式: var length …

生產者消費者模型(條件變量)

三種關系:互斥,同步,互斥和同步 兩類角色:生產者,消費者(線程) 一個交易場所:生產者消費者共享的區域 賣蘋果的模型 dish上面只有一個蘋果買家必須要等賣家把蘋果放到dish上才可以去買蘋果。…

linux之信號

信號:在生活中,我們遇到過不同種類的信號,比如:(交通信號,乃至某個人的表情,動作等帶給你不同的信號)然而,在我們的linux下,我們最熟悉的就是,當遇…

視頻解析有感,在解析 iqiyi與qq視頻的時候,記錄一些發現

最近對iqiyi與qq視頻解析發現,兩個網站的解析流程,尤其是反解析措施 各有特點,簡單記錄一下 先說iqiyi, 瀏覽器模擬移動端可以拿到視頻的mp4鏈接,這個不多說。 iqiyiPC端瀏覽器獲取 ts過程: a.iqiyi一次性…

C語言atoi函數的用法

#include < stdlib.h > int atoi(const char *nptr);用法&#xff1a;將字符串里的數字字符轉化為整形數。返回整形值。 注意&#xff1a;轉化時跳過前面的空格字符&#xff0c;直到遇上數字或正負符號才開始做轉換&#xff0c;而再遇到非數字或字符串結束時(’/0’)才…

[Linux]繼續探究mysleep函數(競態條件)

之前我們探究過mysleep的簡單用法&#xff0c;我們實現的代碼是這樣的&#xff1a; #include<stdio.h> #include<signal.h>void myhandler(int sig) {}unsigned int mysleep(unsigned int timeout) {struct sigaction act,oact;act.sa_handler myhandler;sigempt…

C語言的atoi和C++的to_string

to_stringint to string將其他型轉換成字符串型atoiascii to integer是把字符串轉換成整型數的一個函數 to_string #include <iostream> // std::cout #include <string> // std::string, std::to_stringint main () {std::string perfect std::to_string…

ubuntu 升級python3.5到python3.7,并升級pip3

1, 下載python3.7.tgz 文件&#xff0c;解壓&#xff0c; 2. 編譯安裝 3. 刪除 /usr/bin 目錄下的 pip3, python3 4. 建立新的軟連接&#xff1a; #添加python3的軟鏈接ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3#添加 pip3 的軟鏈接ln -s /usr/local/python3/b…

[Linux]死鎖

死鎖是指多個進程在運行過程中因爭奪資源而造成的一種僵局&#xff0c;當進程處于這種僵持狀態時&#xff0c;若無外力作用&#xff0c;它們都將無法再向前推進。之前信號量的時候我們知道&#xff0c;如果多個進程等待&#xff0c;主要體現在占有鎖的問題上。死鎖也可以被定義…

Python安裝第三方模塊總結 轉載的

轉自 https://www.jellythink.com/archives/541

[C++]vector創建二維數組

c.resize(n);將c重置為大小為n個元素向量&#xff0c;如果n比原來的元素多&#xff0c;則多出的元素常被初始化為0//節選《面向對象的程序設計》杜茂青 int N5, M6; vector<vector<int> > Matrix(N); for(int i 0; i< Matrix.size(); i){ Matrix[i].resize(M…

[Linux]線程安全和可重入函數

線程安全&#xff1a;一個函數被稱為線程安全的&#xff0c;當且僅當被多個并發進程反復調用時&#xff0c;它會一直產生正確的結果。如果一個函數不是線程安全的&#xff0c;我們就說它是線程不安全的。 重入&#xff1a;函數被不同的控制流程調用,有可能在第一次調用還沒返回…

[Linux]信號量

信號量是一個計數器&#xff0c;用于為多個進程提供對共享數據對象的訪問。 在信號量上只有三種操作可以進行&#xff0c;初始化、遞增和增加&#xff0c;這三種操作都是原子操作。遞減操作可以用于阻塞一個進程&#xff0c;增加操作用于解除阻塞一個進程。 為了獲得共享資源…

Linux VIM 程序中有游離的‘\357’ ‘\274’錯誤

gcc date.cpp -o date -lstdc date.cpp:18:20: 錯誤&#xff1a;程序中有游離的‘\357’date.Showdata()&#xfffd;&#xfffd;&#xfffd;^ date.cpp:18:21: 錯誤&#xff1a;程序中有游離的‘\274’date.Showdata()&#xfffd;&#xfffd;&#xfffd;^ date.cpp:18:22…

[Linux]關于SIGCHLD

之前我們就學過&#xff0c;關于wait和waitpid來處理僵尸進程&#xff0c;父進程等待子進程結束后自己才退出&#xff0c;這樣的方法有倆種方式&#xff0c;一種是父進程死死的等子進程退出&#xff0c;也就是使用阻塞的方式等待子進程退出&#xff0c;另一種方式是通過非阻塞的…

C語言思維導圖

本人能力有限&#xff0c;知識點難免概括不全&#xff0c;如有錯誤歡迎指正

轉載一篇關于curl的文章

轉載一篇關于curl的文章 http://www.360doc.com/content/16/0107/15/18578054_526158476.shtml