導航:首頁 > 操作系統 > linux注冊信號

linux注冊信號

發布時間:2023-04-27 13:24:24

A. linux c問題信號處理函數

為什麼my_func函數調用不用實參?
函數裡面不是有個形參sign_no使用嗎?
答:
my_func沒有調用,只是注冊信號處理函數,你不是山散還寫了注釋嗎?
什麼叫注冊,舉個例子,就是你告訴你的歷裂管家,客人sigint和客人sigquit來了之後按方案my_func招待(參數就是客人),告訴就是注冊。告訴的時候招逗爛氏待方案實施了嗎?沒有。要等到客人真的來了才會實施,也就是調用,操作系統會自動調用並用具體型號值作為參數。至於用什麼做參數的問題,那是你和管家之前就協商好的,也就是signal文檔裡面說明好了的。

B. linux下信號注冊,該怎麼解決

在linux的系統中,同一個程序的信號在該程序反復運行時彎粗,在內核中反復注冊,在程序調用該兆鬧純信號的,該信號的注冊函數就會反復運行。注冊多少族咐次,注冊函數就會運行多少次。因此,在編寫程序時,需要注意,如果不用信號時一定要取消。

C. linux中的信號怎麼理解

編號為1 ~ 31的信號為傳統UNIX支持的信號,是不可靠信號(非實時的),編號為32 ~ 63的信號是後來擴充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區別在於前者不支持排隊,可能會造成信號丟失,而後者不會。

D. 什麼是Linux的信號

信號就是Linux中產生的某個事件,接收到信號的進程會採取相應的行動,信號由shell和終端處理器產生來引起中斷,還可以作為進程傳遞消息和修改默認行為的一種方式。簡單的,可以理解成Linux系統與進程的一種「交互」方式,像在終端中按下的Ctrl+C、Ctrl+Z組合鍵所產生的都是屬於信號。

E. Linux fd 系列|信號編程(signal)竟能這樣做漲姿勢

來源 | 奇點雲存儲(id : qiyacloud)授權轉載

如若轉載請聯系原公眾號


信號是什麼?


首先說,信號(signal)是什麼?

信號( signal )本質是 Linux 進程間通信的一種機制,也叫 軟中斷信號 。既然是通信機制,那麼就是傳遞信息用的,信號傳遞的信息很簡單,就是一個整數,一般用於配合系統管理任務,比如進程的終結、恢復、熱載入等。

信號都用整數常量表示,命名以 SIG 為前綴,比如 SIGINT( ctrl-c 觸發),SIGKILL( kill -9 觸發 )。

信號一般怎麼產生?

信號處理分為兩個階段


signalfd 是什麼?


了解了什麼是信號( signal ),那 signalfd 又會是什麼呢?

是一個跟信號關聯的 文件描述符 ,能夠以 io 的行為獲取到系統信號,屬性上來講 signalfd 也是一個匿名 fd 類型。


signalfd 長什麼樣子?


奇點按照 man signalfd 裡面的例子,寫了個 demo,跑在 Linux 機器上,按照慣例去看下 fd 的樣子。

從這里可以得到簡單的信息:


signalfd 使用姿勢?


其實信號是很講究的,甚至有信號編程一說,Linux 的 signalfd 為信號的處理提供了一種新的方法, 統一到文件的 io 模式,契合一切接文件的理念

系統調用:

該系統調用返回一個整數類型 signalfd,這個句柄跟信號行為綁定,當發生信號的時候,句柄觸發可讀事件。

第一個參數也可以傳入一個有效的信號 fd 的句柄, 如果傳入的是 -1 ,那麼內核會自動創建一個新的 fd 。

完整的代碼例子,在 Linux 機器上,通過 man signalfd 就可以獲取到。

上面的例子,signalfd 沒有信號(沒有可讀事件)的時候會阻塞在 read 調用上,運行效果如下:

可以看到每一次 ctrl + c 觸發的信號被捕捉到,並且列印出來。用文件 io 的方式來接收信號,牛。

怎麼做到的呢?照例,我們淺析一下內核的代碼,位於 fs/signalfd.c ,這是一個很小的文件,正是這個文件完成了對信號「文件化」的封裝。

上面最笑神重要的兩個調用:


signalfd 原理剖析



1 signalfd

看一下 signalfd 支持的介面調用:

通過這個可以知道 signalfd 支持的特性:


2 signalfd_poll


這個函數做的事情非常簡單,就是把 等待對象 掛到當前進程的信號結構的鏈表上。表頭是: current->sighand->signalfd_wqh ,這個就有意思了,這里直接掛到當前進程的結構上。換句話說,喚醒也是自此表頭開始。

回憶一下 timerfd ,是掛在 timerfd_ctx->wqh 的欄位上。這里的差別是因為信號是對進程來說的。


3 signalfd_read


讀一個 signalfd 的操作非常簡單,主要邏輯:碰仿虧

簡要的代碼注釋如下:

這里就能非常清晰的看到, 進程有信號的時候,signalfd 句柄就是可讀的大州


signal 和 epoll 的配合



1 熟悉的 epoll_ctl


epoll_ctl 注冊 signalfd 的時候,調用 signalfd_poll , signalfd_poll 會把 epoll 創建的 wait entry 掛到 current->sighand 上。喚醒的時候調用這個 wait 鏈表的回調。


2 什麼時候喚醒呢?


喚醒的操作其實不在 signalfd.c 文件中,而是在原有的信號軟中斷的流程中。

為了知識的完整性,說個點, signalfd_notify 其實在 timer 定時器的流程中也有調用,但跟我們本次主幹沒啥關系,這里忽略。

信號的發送喚醒的簡要示意圖:


所有的信號發送都會調用到 send_signal ,在這個裡面實現了喚醒 sighand->signalfd_wqh 鏈表的操作。從而使得 epoll 感知到 signalfd 可讀了(因為來信號了),使得 epoll 從 epoll_wait 出喚醒,然後調用 read 操作,把信號的相關信息從句柄中讀出來。

劃重點:喚醒在 信號發送 的過程。


總結


F. linux系統中SIGUSR1信號是如何產生的。

首先,Linux中的信號可以通過kill -l命令獲取,如下圖所示:

如上圖所示,編號為1 ~ 31的信號為傳統UNIX支持的信號,是不可靠信號(非實時的),編號為32 ~ 63的信號是後來擴充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區別在於前者不支持排隊,可能會造成信號丟失,而後者不會。


其次,SIGUSR1 ,這是留給用戶使用的信號。一般在編程中使用。舉例說明:sigqueue向本進程發送數據的信號,C語言代碼如下 :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void myhandler(int signo,siginfo_t *si,void *ucontext);
int main(){
union sigval val;//定義一個攜帶數據的共用體
struct sigaction oldact,act;
act.sa_sigaction=myhandler;
act.sa_flags=SA_SIGINFO;//表示使用sa_sigaction指示的函數,處理完恢復默認,不阻塞處理過程中到達下在被處理的信號
//注冊信號處理函數
sigaction(SIGUSR1,&act,&oldact);
char data[100];
int num=0;
while(num<10){
sleep(2);
printf("等待SIGUSR1信號的到來 ");
sprintf(data,"%d",num++);
val.sival_ptr=data;
sigqueue(getpid(),SIGUSR1,val);//向本進程發送一個信號
}

}
void myhandler(int signo,siginfo_t *si,void *ucontext){
printf("已經收到SIGUSR1信號 ");
printf("%s ",(char*)(si->si_ptr));

}

G. linux信號

1 信號的響應動作

每個信號都有自己的響應動作,當接收到信號時,進程會根據信號的響應動作執行相應的操作,信號的響應動作有以下幾種:

中止進程(Term)

忽略信號(Ign)

中止進程並保存內存信息(Core)

停止進程(Stop)

繼續運行進程(Cont)

用戶可以通過signal或sigaction函數修改信號的響應動作(也就是常說的「注冊信號」,在文章的後面會舉例說明)。另外,在多線程中,各線程的信號響應動作都是相同的,不能對某個線程設置獨立的響應動作。

2 信號類型

Linux支持的信號類型可以參考下面給出的列表。

2.1 在POSIX.1-1990標准中的信號列表

2.2 在SUSv2和POSIX.1-2001標准中的信號列表

2.3 其它信號

H. linux 的信號種類

主要信號及說明:
SIGHUP 掛起信號
SIGINT 中斷信號
SIGQUIT 退出信號
SIGILL 非法指令
SIGTRAP 跟蹤/斷點中斷
SIGABRT 放棄
SIGFPE 浮點異常
SIGKILL 刪除(不能捕獲或者忽略)
SIGBUS 匯流排錯誤
SIGEGV分段錯誤
SIGSYS 系統調用錯誤參數
SIGPIPE 管道錯誤
SIGALRM 鬧鍾
SIGTERM 軟體終止
SIGUSR1 用戶信號1
SIGUSR2 用戶信號2
SIGCHLD子狀態改變
SIGPWR 功能失敗/重新啟動
SIGWINCH 窗口大小改變
SIGUGR 緊急網路界面介面條件
SIGPOLL 可修改的事件發生
SIGSTOP 停止(不能捕獲或忽略)
SIGTSTP 用戶停止請求
SIGCONT停止的進程繼續進行

閱讀全文

與linux注冊信號相關的資料

熱點內容
想創app軟體怎麼操作 瀏覽:199
為啥電腦總是顯示沒有文件夾 瀏覽:674
iphone顯示無法驗證app怎麼回事 瀏覽:968
推薦解壓好游戲 瀏覽:275
cpu伺服器過載怎麼辦 瀏覽:618
zip內存壓縮 瀏覽:311
阿里雲99元伺服器不可以退款 瀏覽:337
linux下安裝vnc 瀏覽:656
微信圖片加密編輯可見 瀏覽:704
江恩操盤術pdf 瀏覽:930
本機構所屬的伺服器是什麼意思 瀏覽:785
c編譯器有哪些段 瀏覽:863
qq原創表情在哪個文件夾 瀏覽:626
點點賺app現在怎麼不能用了 瀏覽:364
網紅阿里程序員事件 瀏覽:204
演算法設計心得體會 瀏覽:118
java修改ip 瀏覽:151
php不需要編譯嗎 瀏覽:136
特斯拉新車如何用app控制 瀏覽:187
文檔拖到文件夾就不見了 瀏覽:816