signal() 函數詳解
void (*sfp)(int); |
sfp 的類型可以通過將上面的聲明中的sfp去掉而得到,即void (*)(int)。此外,signal函數的返回值是一個指向調用前的用戶定義信號處理函數的指針,這個指針的類型與sfp指針類型一致。因此,我們可以如下聲明signal函數:
void (*signal(int, void(*)(int)))(int); |
同樣地,使用typedef可以簡化上面的函數聲明:
typedef void (*HANDLER)(int); |
Ok;看個例子:
#include<stdio.h>
#include<signal.h>
void handler(int signo)//自定義一個函數處理信號
{
printf("catch a signal:%d\n:",signo);
}
int main()
{
signal(2,handler);
while(1)
{
printf("1111\n");
sleep(1);
}
return 0;
}
此程序是對當我們按下CTRL +C鍵時,會執行我們定義的信號處理函數。
每當我們按下CTRL +C鍵時會打印該信號的number.可以看出該信號的num為2
要想退出可以按下CTRL +\ 打印結果為最后一行。
------------------------------------------------------------------------------
Linux kill 命令補充說明:
功能說明:刪除執行中的程序或工作。
語 法:kill [-s <信息名稱或編號>][程序] 或 kill [-l <信息編號>]
補充說明:kill可將指定的信息送至程序。預設的信息為SIGTERM(15),可將指定程序終止。若仍無法終止該程序,可使用SIGKILL(9)信息嘗試強制刪除程序。程序或工作的編號可利用ps指令或jobs指令查看。
參 數:
-l <信息編號> 若不加<信息編號>選項,則-l參數會列出全部的信息名稱。
-s <信息名稱或編號> 指定要送出的信息。
[程序] [程序]可以是程序的PID或是PGID,也可以是工作編號。
一些常用的Signal 如下:
所有信號見https://blog.csdn.net/qq_35420908/article/details/70175247
Signal | Description |
SIGABRT | 由調用abort函數產生,進程非正常退出 |
SIGALRM | 用alarm函數設置的timer超時或setitimer函數設置的interval timer超時 |
SIGBUS | 某種特定的硬件異常,通常由內存訪問引起 |
SIGCANCEL | 由Solaris Thread Library內部使用,通常不會使用 |
SIGCHLD | 進程Terminate或Stop的時候,SIGCHLD會發送給它的父進程。缺省情況下該Signal會被忽略 |
SIGCONT | 當被stop的進程恢復運行的時候,自動發送 |
SIGEMT | 和實現相關的硬件異常 |
SIGFPE | 數學相關的異常,如被0除,浮點溢出,等等 |
SIGFREEZE | Solaris專用,Hiberate或者Suspended時候發送 |
SIGHUP | 發送給具有Terminal的Controlling Process,當terminal被disconnect時候發送 |
SIGILL | 非法指令異常 |
SIGINFO | BSD signal。由Status Key產生,通常是CTRL+T。發送給所有Foreground Group的進程 |
SIGINT | 由Interrupt Key產生,通常是CTRL+C或者DELETE。發送給所有ForeGround Group的進程 |
SIGIO | 異步IO事件 |
SIGIOT | 實現相關的硬件異常,一般對應SIGABRT |
SIGKILL | 無法處理和忽略。中止某個進程 |
SIGLWP | 由Solaris Thread Libray內部使用 |
SIGPIPE | 在reader中止之后寫Pipe的時候發送 |
SIGPOLL | 當某個事件發送給Pollable Device的時候發送 |
SIGPROF | Setitimer指定的Profiling Interval Timer所產生 |
SIGPWR | 和系統相關。和UPS相關。 |
SIGQUIT | 輸入Quit Key的時候(CTRL+\)發送給所有Foreground Group的進程 |
SIGSEGV | 非法內存訪問 |
SIGSTKFLT | Linux專用,數學協處理器的棧異常 |
SIGSTOP | 中止進程。無法處理和忽略。 |
SIGSYS | 非法系統調用 |
SIGTERM | 請求中止進程,kill命令缺省發送 |
SIGTHAW | Solaris專用,從Suspend恢復時候發送 |
SIGTRAP | 實現相關的硬件異常。一般是調試異常 |
SIGTSTP | Suspend Key,一般是Ctrl+Z。發送給所有Foreground Group的進程 |
SIGTTIN | 當Background Group的進程嘗試讀取Terminal的時候發送 |
SIGTTOU | 當Background Group的進程嘗試寫Terminal的時候發送 |
SIGURG | 當out-of-band data接收的時候可能發送 |
SIGUSR1 | 用戶自定義signal 1 |
SIGUSR2 | 用戶自定義signal 2 |
SIGVTALRM | setitimer函數設置的Virtual Interval Timer超時的時候 |
SIGWAITING | Solaris Thread Library內部實現專用 |
SIGWINCH | 當Terminal的窗口大小改變的時候,發送給Foreground Group的所有進程 |
SIGXCPU | 當CPU時間限制超時的時候 |
SIGXFSZ | 進程超過文件大小限制 |
SIGXRES | Solaris專用,進程超過資源限制的時候發送 |