现在的位置: 首页 > 综合 > 正文

信号学习笔记2–信号的安装

2013年07月06日 ⁄ 综合 ⁄ 共 1949字 ⁄ 字号 评论关闭

本节使用sigaction安装信号。关于sigaction函数,说明如下:

#include <signal.h>

int sigaction(int sig, const struct sigaction *restrict act,
              struct sigaction *restrict oact);

参数说明:

1)sig: 输入参数,指定要安装的信号

2)act: 输入参数,指定安装信号的数据结构。该参数是一个struct sigaction类型的结构指针。结构体定义位于头文件<bits/sigaction.h>中,定义如下:

/* Structure describing the action to be taken when a signal arrives.  */
struct sigaction
  {
    /* Signal handler.  */
#ifdef __USE_POSIX199309
    union
      {   
    /* Used if SA_SIGINFO is not set.  */
    __sighandler_t sa_handler;
    /* Used if SA_SIGINFO is set.  */
    void (*sa_sigaction) (int, siginfo_t *, void *); 
      }   
    __sigaction_handler;
# define sa_handler __sigaction_handler.sa_handler
# define sa_sigaction   __sigaction_handler.sa_sigaction
#else
    __sighandler_t sa_handler;
#endif

    /* Additional set of signals to be blocked.  */
    __sigset_t sa_mask;

    /* Special flags.  */
    int sa_flags;

    /* Restore handler.  */
    void (*sa_restorer) (void);
  };  

2)该结构是sigaction的核心,结构成员说明如下:

_sigaction_handler: 用于定义信号的处理函数,实际上是指向信号处理函数的指针。可以看出该成员是一个联合类型。一种是与signal调用相同的处理函数,其类型为       _sighandler_t,这种类型的函数只有一个输入参数,即信号值;另一种则是被sigaction系统调用所支持的函数,该函数的声明是:void (*sa_sigaction)(int, siginfo_t *, void *)。

sa_mask: 信号掩码。在信号处理函数执行的过程中,在该掩码中定义的信号将被阻塞。

sa_flags:  标志位。sigaction支持若干标志位,主要的有SA_SIGINFO、SA_RESTART参数等。其中SA_SIGINFO标志标明该信号在发送时可以附带其他数据;                  SA_RESTART参数标明如果信号中断了进城的某个系统调用,则由系统自动重启该系统调用。如果不指定该参数,则被中断的系统调用将返回失败,错误码为                   EINTR。

_oact: 输出参数, 指向struct sigaction 结构的指针。调用sigaction成功后, 该系统中将返回信号的原来处理方式。如果不需要获取原信号处理方式,则该参数可以传入            NULL。

3)返回值说明:

0:调用成功;

-1: 调用失败,可以查看errno获取错误信息。

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

void HandleSigint(int signo, siginfo_t *info, void *none)
{
    printf("receive signal %d, addtional data is %d\n", signo,
            info->si_value.sival_int);
}

int main(void)
{
    struct sigaction act, oact;
    memset(&act, 0x00, sizeof(struct sigaction));
    sigemptyset(&act.sa_mask);
    act.sa_sigaction = HandleSigint;
    act.sa_flags = SA_SIGINFO;
    if (sigaction(SIGINT, &act, &oact) == -1) 
    {   
        perror("sigaction");
        exit(0);
    }   
    pause();

    return 0;
}

运行结构:

[root@localhost linuxc]# ./mysigaction 
        <-输入<CTRL>+<C>
receive signal 2, addtional data is 0

抱歉!评论已关闭.