linux 信号的捕捉和发送函数的简单使用:sigaction()和sigqueue()

linux编程中会对信号进行操作,经常进行捕捉和发送;经常用到对信号的捕捉和发送函数有两对。

1、比较简单的:kill()(用于发送信号)和signal()(用于捕捉信号)

2、高级一些的:sigaction()(用于发送信号)和sigqueue()(用于捕捉信号

 

下面是简单的应用:

siginfo_t
{
    int      si_signo;    /* Signal number */
    int      si_errno;    /* An errno value */
    int      si_code;     /* Signal code */
    pid_t    si_pid;      /* Sending process ID */
    uid_t    si_uid;      /* Real user ID of sending process */
    int      si_status;   /* Exit value or signal */
    clock_t  si_utime;    /* User time consumed */
    clock_t  si_stime;    /* System time consumed */
    sigval_t si_value;    /* Signal value */
    int      si_int;      /* POSIX.1b signal */
    void    *si_ptr;      /* POSIX.1b signal */
    void    *si_addr;     /* Memory location which caused fault */
    int      si_band;     /* Band event */
    int      si_fd;       /* File descriptor */
}

union sigval 
{
    int   sival_int;
    void *sival_ptr;
};

struct sigaction
{
    void     (*sa_handler)(int);
    void     (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t   sa_mask;
    int        sa_flags;
    void     (*sa_restorer)(void);
};

上面的结构体都是系统函数已经定于好的

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

void my_sigaction(int signo, siginfo_t *info, void *acInfo)
{
    printf("Cat a singal:%d\n",signo);
    printf("send signal id:%d\n",info->si_pid);
    printf("Reveive value_wordr:%s\n",(char *)info->si_value.sival_ptr);
}

int main()
{
    char buf[]={"great"};
    //在父进程中创建一个子进程
    int iFork = fork();
    if (iFork > 0)//父进程
    {
        struct sigaction act;
        memset(&act,0,sizeof(act));
        /*
        //当act.sa_flags = 0时函数sigaction的使用方法
        //给act设置值
        act.sa_flags = 0;//使用结构体struct sigaction中的void (*sa_handler)(int)去处理信号
        act.sa_handler = signal_handler;//设置函数指针
        sigemptyset(&act.sa_mask);//清空结构体struct sigaction中的sa_mask,避免随机值
        //信号安装
        sigaction(SIGINT, &act,NULL);
        */	
        //当act.sa_flags = SA_SIGINFO时函数sigaction的使用方法
        //给act设置值
        act.sa_flags = SA_SIGINFO;//使用结构体struct sigaction中的void (*sa_sigaction)(int, siginfo_t *, void *);去处理信号
        act.sa_sigaction = my_sigaction;//设置函数指针
        sigemptyset(&act.sa_mask);//清空结构体struct sigaction中的sa_mask,避免随机值

        //信号安装
        sigaction(SIGINT, &act,NULL);

        while (1)
        {
        pause();
        }
    }
    else if (iFork == 0)//子进程
    {
        sleep(1);
        union sigval val;
        val.sival_ptr = (void *)buf;
        sigqueue(getppid(),SIGINT,val);
    }
    else
    {
        perror("fork error:");
    }

    return 0;
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值