當前位置:首頁 » 操作系統 » linux信號捕獲

linux信號捕獲

發布時間: 2023-07-18 01:35:13

① 為什麼linux設置了SIGINT信號捕捉函數,按下Ctrl+C以後還會結束進程

因為Ctrl+C結束是不能阻止的

② linux中的信號怎麼理解

linux的常用信號量BUS與SEGV二者都是錯誤信號,BUS表示匯流排錯誤,SEGV表示段錯誤,程序崩潰的時候99%都是這兩個錯誤導致的。進程可以捕獲和封鎖這兩類錯誤。內核對二者的默認處理是memorympWINCH窗口改變信號(WINdownCHanged)。例如虛擬終端的行數發生變化時將發送WINCH信號,絕大多數文本編輯器都能捕獲WINCH信號自動進行重新配置。內核的默認處理是忽略該信號,並且不進行內存轉儲。進程可以捕獲或者封鎖該信號KILL 殺死/刪除進程,編號為9STOP 掛起/暫停正在執行的進程,直到收到CONT為止KILLSTOP都不能夠被捕獲、封鎖或者忽略,默認處理都不會產生內存轉儲。CONT 取消掛起,繼續執行進程TSTP 是STOP信號的「軟」版本,即在用戶輸入Ctrl+Z時由終端驅動程序發送的信號。捕獲到該信號的進程通常清除它們的狀態,如何給自己發送一個STOP信號。TSTP的默認處理不會導致內存轉儲。INT 中斷信號,編號為2當用戶輸入Ctrl+C時由終端驅動程序發送INT信號INT信號是終止當前操作的請求,簡單程序捕獲到INT信號時應該退出,擁有命令行或者輸入模式的那些程序應該停止他們正在做的事情,清除狀態,並等待用戶再次輸入。TERM 軟體終止信號,編號為15TERM是請求徹底終止某項操作的信號,它期望進程清楚自己的狀態並退出QUIT 退出信號,編號為3與TERM類似,不同之處在於QUIT信號的默認處理是內存轉儲,而TERM信號的默認處理沒有內存轉儲。HUP 掛起信號,編號為1,有兩種解釋:守護進程理解HUP為重新設置的請求,如果守護進程能夠不用重新啟動就能夠重新讀取它自己的配置文件並調整自己以適應變化的話,那麼HUP信號通常可以用來觸發這種行為HUP信號有時有終端驅動程序生成,試圖用來清除(也就是終止)跟某個特定終端相連接的那些進程。例如當一個終端會話結束時,或者當一個Modem的連接不經意的斷開時,就可能出現這種情況。如果需要某些進程在會話結束之後繼續運行,那麼在CShell中設法讓這些進程變成後台程序,ksh或者bash中可以用nohup來模擬這種行為。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++進程的四種狀態runnable(可運行狀態)只要有CPU時間,進程就可以執行。一旦進程執行了不能立即完成的系統調用,Linux會把進程轉入睡眠狀態sleeping(睡眠狀態)進程在等待某些事件發生(如終端輸入、網路連接)zombie(僵化狀態)進程已經執行完畢並試圖消亡,但是狀態沒有收集完stopped(停止狀態)進程被掛起,不允許執行。進程收到STOP或者TSTP信號即進入停止狀態,可以用CONT信號來重新啟動

③ 關於linux中信號SIGINT的捕獲問題,求大大們指教

網上有Webtop的破解方法,可在Webtop上安裝全功能版本的Linux。Webtop其實就是一個縮水版的ubuntu。
但是那個Ubuntu是有很大的限制的,和PC的Ubuntu區別很大。基本上是只能上網和使用非常有限的一些應用。要直接使用ubuntu得破解,而且還很麻煩。
我現在就等Webtop到手開工了。
至於Linux支持的CPU,那得看發行版。部分Linux發行版是支持目前所有的商用CPU的,從X86到ARM到IA64通吃,也有部分是高度專精的,如Arch就只支持X86.
不過我強烈不建議用Atrix來做音樂製作系統,畢竟處理能力太弱,據說破解之後正常上網十分鍾手機就變得非常燙。音樂製作那就可想而知了。
還有,你要使用USB音效卡,還得考慮一下音效卡有沒有相應版本的驅動。
總之Webtop並不能算是全功能的筆記本,只能當上網本來用。我買Webtop也主要是因為筆記本太大太重,平時帶著上課做筆記不方便才買來,記筆記基本上只用得到瀏覽器和文本編輯器,這些都不是問題。但是音樂製作,還是用完整的PC為好。
=======================
另外Android並不能算是Linux的發行版。Android的機制是運行在Linux內核上的一套虛擬機程序,其應用和直接基於Linux的本地應用程序有很大的不同,除非重編譯,二進制包是不通用的。

④ linux系統上信號發送和信號接收講解

用於進程間通信,通信機制由操作系統保證,比較穩定。

在linux中可以通過kill -l查看所有信號的類型。

kill -信號類型 進程ID

int kill(pid_t pid, int sig);
入參pid :
pid > 0: 發送信號給指定的進程。
pid = 0: 發送信號給 與調用kill函數進程屬於同一進程組的所有進程。
pid < 0: 取|pid|發給對應進程組。
pid = -1:發送給進程有許可權發送的系統中所有進程。
sig :信號類型。
返回值 :成功:0;失敗:-1 (ID非法,信號非法,普通用戶殺init進程等權級問題),設置errno
以OpenHarmony源碼為例,應用ANR後,AbilityManagerService會通知應用mp堆棧信息,就是通過信號量做的。

頭文件位置 :
include <signal.h>
函數解釋 :
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
當接收到指定的信號signum時,就會跳轉到參數handler指定的函數執行。其中handler的入參是信號值。

函數原型

signum參數指出要捕獲的信號類型,act參數指定新的信號處理方式,oldact參數輸出先前信號的處理方式(如果不為NULL的話)。
sigaction結構體

sa_handler 信號處理函數
sa_mask 在處理該信號時可以暫時將sa_mask 指定的信號集擱置
sa_flags 指定一組修改信號行為的標志。 它由以下零個或多個的按位或組成
   SA_RESETHAND:當調用信號處理函數時,將信號的處理函數重置為預設值SIG_DFL
   SA_RESTART:如果信號中斷了進程的某個系統調用,則系統自動啟動該系統調用
   SA_NODEFER :一般情況下, 當信號處理函數運行時,內核將阻塞該給定信號。但是如果設置了 SA_NODEFER標記, 那麼在該信號處理函數運行時,內核將不會阻塞該信號
sa_restorer 是一個替代的信號處理程序,當設置SA_SIGINFO時才會用它。
相關函數
int sigemptyset( sigset_t *set);
sigemptyset()用來將參數set信號集初始化並清空。
執行成功則返回0,如果有錯誤則返回-1。
完整示例

⑤ 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 操作,把信號的相關信息從句柄中讀出來。

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


總結


⑥ linux signal 如何捕獲鍵盤上的del鍵。用信號量sigint只能捕獲Ctrl

int catch( int sig )
{
printf("recv del\n" );
}

int main()
{
signal( SIG_INT, catch );
while( getchar() != '\n' ) ;
return 0;
}

按回車結束程序,按Del會輸出recv del。
不行么

熱點內容
伺服器電腦機房是幹嘛的 發布:2025-03-16 02:30:47 瀏覽:488
龍貝格演算法c語言 發布:2025-03-16 02:26:28 瀏覽:101
c語言字元串讀入 發布:2025-03-16 02:21:23 瀏覽:476
python爬蟲開發環境 發布:2025-03-16 02:19:55 瀏覽:626
androidondestory 發布:2025-03-16 02:12:49 瀏覽:862
軟體源碼侵權 發布:2025-03-16 02:06:54 瀏覽:287
給表添加欄位的sql 發布:2025-03-16 02:04:29 瀏覽:473
1除5演算法 發布:2025-03-16 02:02:57 瀏覽:757
oppo雲密碼本在哪裡 發布:2025-03-16 01:57:13 瀏覽:534
c語言定義pi的 發布:2025-03-16 01:51:08 瀏覽:603