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.
注意: SIGKILL 與 SIGSTOP 無法被略過以及攔截.

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.
當 sig 為 0 時, 沒有 signal 會被傳遞. 通常用於檢查 process 是否存在(existence) 或權限(permission)

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

Reference

  1. Linux Programmer's Manual - SIGNAL(7)
  2. Linux Programmer's Manual - SIGNAL(2)
  3. signal API
  4. Linux Programmer's Manual - kill(2)
  5. Linux Programmer's Manual - sigaction(2)

留言

這個網誌中的熱門文章

yocto recipe : (1) 撰寫 recipe

yocto recipe : (2) 撰寫 bbappend

yocto recipe : (3) 使用 External Source 來編譯軟體