2015年7月2日 星期四

Signals on Linux

Linux 存在有 Signal 的機制,當我們在執行某支 Process 時,可以利用 Signal 對特定正在執行的 Process 給予特定的訊息。

事實上,當我們執行 Process 時,按下 Ctrl-C、Ctrl-Z 等等,其實也算是另外一種對 Process 送出 Signal 的動作,例如在 Linux 裡 Ctrl-Z 是送出 SIGTSTP 的 Signal,預設是將 Process 進行暫停的動作,而 Ctrl-C 則是送出 SIGINT 的 Signal,其意義是鍵盤對 Process 送出 Interrupt 的動作,預設是停止目前前景的 Process。

在 Signal manual 有更詳細所有的 Signal 介紹

另外,在處裡關於 Signal 的部分,預設在 Linux 都具有原本預設的處理方法,但其實我們是可以 Overwrite 改成我們想要的處理方式。

C API
http://man7.org/linux/man-pages/man2/signal.2.html

首先需要引入 signal.h 這個 header file,然後建立一個 signal handler 帶有 signal number 的參數,最後在 main function 利用 signal function 掛上 signal handler,一旦 process 發生了你所指定的 signal,便會導到你自己的 handler。


#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);


P.S. 如果想要改成原來預設 Linux 的 Default Handler,可以將 handler 改成 SIG_DFL,如果要忽略這一個 Signal,則可以改成 SIG_IGN。

其中 SIGKILL 和 SIGSTOP 是不能被更改和捕抓的,意思就是你不能 Overwrite,就算 Overwrite 了,他也不會理你。

沒有留言:

張貼留言