天天看點

UNIX環境進階程式設計筆記(10)- 函數signal前言一、函數signal二、函數signal使用總結

前言

本章主要介紹signal及指令行發送SIGUSR1和SIGUSR2信号的處理。

一、函數signal

#include<signal.h>

void (*signal(int signo,void (*func)(int)))(int);

其中,參數1 signo為信号名,通常可以取值為SIGABRT SIGABRT SIGCHLD SIGGEMT SIGFPE SIGINT SIGUSR1 SIGUSR2;

參數2 func值可以是常量SIG_IGN(忽略此信号)、常量SIG_DFL(系統預設動作)、 當接收到此信号後要調用的函數位址

其中<signal.h>中定義了 #define SIG_ERR (void (*)())-1         #define SIG_DFL (void (*)())0                 #define SIG_IGN (void (*)())1

也可以定義為 typedef void Sigfunc(int);然後,可以将signal函數原型寫成Sigfunc *signal(int,Sigfunc*);

二、函數signal使用

1.signal

代碼如下(示例):

static void sig_usr(int signo)
{
    if(signo == SIGUSR1)
        printf("received SIGUSR1\n");
    else if(signo == SIGUSR2)
        printf("received SIGUSR2\n");
    else
        err_dump("received signal %d\n",signo);
}
void unix_10_2_signal(void)
{
    printf("catch sig SIGUSR1 and SIGUSR2")
    if(signal(SIGUSR1,sig_usr) == SIG_ERR)
        err_sys("can't catch SIGUSR1");
    if(signal(SIGUSR2,sig_usr) == SIG_ERR)
        err_sys("can't catch SIGUSR2");
    for(;;)
        pause();
}
#define UNIX_10_2_SIGNAL
int main(int argc, char *argv[])
{
#ifdef UNIX_10_2_SIGNAL
    unix_10_2_signal();
#endif
    printf("MAIN END\n");
    return 0;
}                程式運作步驟如下
./main &    在背景啟動程式
kill -USR1  26225   向程序id為26225發送SIGUSR1信号
kill -USR2 26225    向程序id為26225發送SIGUSR2信号
kill 26225 終止此信号
運作圖如下:
      

總結

本章主要介紹了signal函數的接口以及使用例程。

繼續閱讀