傳送訊號的方式有幾種:
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 函式的功能是使程式異常終...