【Linux】信号通道——信号的设置:signal()和sigaction()

signal()

使用该函数时,只需要指定信号类型和信号处理函数即可。不支持信号传递。

头文件:#include

函数原型:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

signum:指定信号代码

handler:

SIG_IGN:忽略该信号

SIG_DFL:采用系统默认方式处理信号

自定义的信号处理函数

成功:以前的信号处理函数

出错:-1

示例:使用signal()函数捕捉相应信号,并给定处理。

#include 
#include 
#include 

//自定义信号处理函数
void my_func(int sig_no)
{
    if(sign_no==SIGINT)
    {
        printf("I have got SIGINT\n");
    }
    else if(sign_no==SIGQUIT)
    {
        printf("I have got SIGQUIT\n");
    }
}

int main()
{
    printf("Waiting for signal SIGINT or SIGQUIT...\n");
//设置信号处理函数
    signal(SIGINT,my_func);
    signal(SIGQUIT,my_func);
    pause();//?
    exit(0);
}

sigaction()

比signal()更健全,建议使用。

头文件:#include

函数原型:int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

signum:信号类型,除了SIGKILL和SIGSTOP之外的任何一个信号

act:指向sigaction结构体的指针,包含对特定信号处理

oldact:保存信号原先的处理方式

成功:0

出错:-1

#include 
#include 
#include 

//自定义信号处理函数
void my_func(int sig_no)
{
    if(sign_no==SIGINT)
    {
        printf("I have got SIGINT\n");
    }
    else if(sign_no==SIGQUIT)
    {
        printf("I have got SIGQUIT\n");
    }
}
int main()
{
    struct sigaction action;
   
    sigaction(SIGINT,0,&action);
    action.sa_handler=my_func;
    sigaction(SIGINT,&action,0);
    
    sigaction(SIGINT,0,&action);
    action.sa_handler=my_func;
    sigaction(SIGINT,&action,0);
    printf("Waiting for signal SIGINT or SIGQUIT...\n");
    pause();
    exit(0);
}

你可能感兴趣的:(linux,c语言)