UNIX再學習 傳送訊號

2021-07-31 13:37:35 字數 3066 閱讀 1020

傳送訊號的方式有幾種:

sigint (2):ctrl+c  中斷符

sigquit (3):ctrl+\  退出符

sigtstp (20):ctrl+z  停止符

sigill (4)    程序試圖執行非法指令

sigbus (7)    硬體或對齊錯誤

sigfpe (8)    算術異常

sigsegv (11)    無法記憶體訪問

sigpipe (13)    向無讀取程序的管道寫入

sigstkflt (16)    協處理器棧錯誤

sigxfsz (25)    檔案資源超限

sigpwr (30)    斷電

sigsys (31)    程序試圖執行無效系統呼叫

kill [-訊號] pids

若不指明具體的訊號,預設傳送 sigterm (15) 訊號。

該訊號允許使用者優雅地終止程序。程序可以選擇捕獲該訊號,並在臨終之前完成必要的清理和善後工作。但如果捕獲了該訊號,卻死賴著不走,則有流氓程序之嫌。

若要指明具體訊號,可以使用訊號編號,也可以使用訊號名稱,而且訊號名稱中的「sig」字首可以省略不寫。例如:

kill -9 1234

kill -sigkill 1234

kill -kill 1234

kill -9 -1 (終止所有程序)

接收訊號的程序可以是乙個、多個或所有的(pids 取 -1)。拆機使用者可以傳送任何程序,而普通使用者只能傳送自己的程序。

#include #include int kill(pid_t pid, int sig);

返回值:成功(至少發出去乙個訊號)返回 0,失敗返回 -1

向指定程序或程序組傳送訊號

kill 的 pid 引數有以下 4 種不同的情況。

pid > 0     將該訊號傳送給程序 id 為 pid 的程序

pid == 0  將該訊號傳送給與傳送程序屬於同一程序組的所有程序(這些程序的程序組 id 等於傳送程序的程序組 id),而且傳送程序具有許可權向這些程序傳送訊號。這裡用的術語「所有程序」不包括實現定義的系統程序集。對於大多數 unix 系統,系統程序集包括核心程序和 init (pid 為 1)。

pid < 0     將訊號傳送給其程序組 id 等於 pid 絕對值,而且傳送程序具有許可權向其傳送訊號的所有程序。如前所述,所有程序並不包括系統程序集中的程序。

pid == -1 將該訊號傳送給傳送程序有許可權向它們傳送訊號的所有程序。若茜所述,所有程序不包括系統程序集中的程序。 

引數 sig 為訊號編號取 0 可用於檢查 pid 程序是否存在,如果不存在 kill 函式返回 -1,且 errno 為 esrch。

//示例一

//使用kill函式傳送訊號

#include #include #include #include #include void fa(int signo)

int main(void)

if(0 == pid) //子程序

sleep(1);

//判斷子程序是否存在

if(0 == kill(pid,0))

return 0;

}輸出結果:

pid = 4569

父程序傳送訊號50

捕獲到了訊號50

//示例二 殺死程序

#include #include #include #include #include int main(void)

else if(pid==0)

else

return 0;

}輸出結果:

這是父程序,pid=4705

這是子程序,pid=4706,父程序的pid=4705

按回車鍵,終止父程序

已終止

示例一,傳送訊號 50 給子程序。如果 kill 第二個引數 sig 取 0,可判斷子程序是否存在。

示例二,傳送 sigterm 給指定父程序。殺死特定程序。

#include int raise(int sig);

返回值:成功返回 0,失敗返回非 0

向呼叫程序自己傳送訊號

sig 為訊號編號

raise 函式實際上是給呼叫程序或者執行緒傳送訊號。

對於單執行緒應用來說,它相當於 kill (getpid (), sig);

對於多執行緒應用來說,它相當於 pthread_kill (pthread_self (), sig);

若所發訊號**獲,raise 函式會在訊號處理函式返回後返回。

//示例一

//使用raise函式傳送訊號

#include #include #include #include void fa(int signo)

int main(void)

else

//使用raise函式傳送訊號2

raise(2);

while(1);

return 0;

}輸出結果:

總算美美地睡了個好覺

捕獲到了訊號2

//示例二 程序自殺

#include #include #include #include int main (void)

輸出結果:

按回車鍵,終止程序

已終止

示例一,如果不使用 ctrl+c,而是等待 10 秒,raise 函式會傳送訊號 2。

示例二,raise 傳送訊號 sigterm,終止程序。

pthread kill 向執行緒傳送訊號

別被名字嚇到,pthread kill可不是kill,而是向執行緒傳送signal。還記得signal嗎,大部分signal的預設動作是終止程序的執行,所以,我們才要用signal 去抓訊號並加上處理函式。int pthread kill pthread t thread,int sig 向指定id...

Linux 傳送訊號, 修改鍵對映

遇到乙個問題,用ssh 工具登陸遠端linux 系統後,使用 sqlplus 會出現問題,比如輸入 eixt,發現輸入錯誤,然後backspace 想刪除這些字元,發現沒有刪除字元,卻出現了 h 符號.這個原因是我的計算機上傳送的訊號是 h,但是在遠端 linux 上erase 訊號對映到 訊號.可...

UNIX再學習 函式abort

abort 函式之前有講過的,參看 c語言再學習 關鍵字return和exit 函式 然後我們在講 8 中程序終止時,也說過。參看 unix再學習 exit 和 wait 系列函式 下面來詳細講一下它。include void abort void 此函式無返回值abort 函式的功能是使程式異常終...