IPC : (2) signal
Signal
Signal 為 Linux IPC(Inter-process communication)的方式之一. process 藉由 system call 傳遞特定 signal number 至另一個 process.
當 signal number 被傳遞至目標 process, process 會執行下列其中一項應對[2]:
- 此 signal number 的配置(disposition) 被設為 SIG_IGN(signal is ignored)[3]. 忽略此 signal number
- 此 signal number 的配置(disposition) 被設為 SIG_DFL(default signal handling)[3]. default action 會處理此 signal number
- 此 signal number 的配置(disposition) 對應到一個 function. 呼叫對應的 handler function[3] 並把 signal number 帶入此 function.
API 範例
以下針對 signal 與 kill 的 API 說明. 完整的範例程式可於 github 看到API 說明
signal[2]
#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
在 signal 函數設置 signum 所要對應的 handler. 其 handler 可以為 SIG_IGN, SIG_DFL 或者自訂的 handler. 其 handler 格式為 void (*sighandler_t)(int);.
kill[4]
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);
發出 signal number 至特定的 process. signum 為所要送的 signal number. pid 為所要送至得 process.
當 pid 為
- pid > 0: 發送 signal number 至擁有此 pid 的 porcess
- pid == 0: 發送至此呼叫此 kill function 的 process, 其 process group 中的所有 process
- pid == -1: 若有權限的情況下, 會發送 signal number 至每一個 processes.
API 範例
// user-defined handler void Handler_SIGUSER1(int iSignal) { printf("(pid %d) I got signal(%d)\n", getpid(), iSignal); } main() { // register handler with the signal number "SIGUSR1" if(SIG_ERR == signal(SIGUSR1, &Handler_SIGUSER1)) { perror("kill errors"); _exit(0); } .... }
先定義 signal handler 函數. 在透過 signal function 把 SIGUSR1 與 Handler_SIGUSER1 做關聯.
補充
[2]有建議改使用 sigactionp[5] 來替代 signal
留言
張貼留言