天天看点

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函数的接口以及使用例程。

继续阅读