本文介绍了我如何收到sigqueue在C程序发送(在Linux上)的信号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何收到收到sigqueue在C程序发送(在Linux上)的信号?

如果只是使用kill发送信号我只需添加一个接收器像这样

 信号(SIGUSR1,SIGUSR1);

这点简单的功能是这样的:

 无效SIGUSR1()
{
    信号(SIGUSR1,SIGUSR1);
    的printf(SIGUSR1 .... \\ n);
}

但是,如果我发送的信号与sigqueue,我会怎么做呢?

谢谢
约翰·


添加sigaction的:

 结构sigaction的行动;action.sa_flags = SA_SIGINFO;
action.sa_sigaction =安培; SIGUSR2;如果(的sigaction(SIGUSR2,&安培;作用,NULL)== -1){
    PERROR(sigusr:sigaction的);
    _exit(1);
}

在哪里SIGUSR2会是这个样子:

 无效SIGUSR2(INT SIGNO,siginfo_t *信息,无效*额外)
{
       无效* ptr_val =信息 - > si_value.sival_ptr;
       INT int_val =信息 - > si_value.sival_int;
       的printf(信号%D,值%d个\\ N,SIGNO,int_val);
}

和只是一个参考例子sigqueue

  sigval值​​;对于(INT I = 10; I< 20;我++)
{
    value.sival_int = I;
    sigqueue(PID,SIGUSR2,价值);
}


解决方案

使用

How do I receive receive a signal sent with sigqueue in a c program (on linux)?

If just use kill to send a signal I just add a receiver with something like this

signal(SIGUSR1,  sigusr1);

that point to a simple function like this:

void sigusr1() 
{  
    signal(SIGUSR1,sigusr1);
    printf("SIGUSR1 ....\n");
}

But if I send a signal with sigqueue, how would I do then?

ThanksJohan


Add a sigaction:

struct sigaction action;

action.sa_flags = SA_SIGINFO; 
action.sa_sigaction = &sigusr2;

if (sigaction(SIGUSR2, &action, NULL) == -1) { 
    perror("sigusr: sigaction");
    _exit(1);
}

Where sigusr2 would look something like this:

void sigusr2(int signo, siginfo_t *info, void *extra) 
{
       void *ptr_val = info->si_value.sival_ptr;
       int int_val = info->si_value.sival_int;
       printf("Signal %d, value %d  \n", signo, int_val);
}

And just for ref a sigqueue example

sigval value;

for(int i=10;i<20;i++)
{
    value.sival_int = i;
    sigqueue(pid,SIGUSR2, value);
}
解决方案

Use sigaction.

这篇关于我如何收到sigqueue在C程序发送(在Linux上)的信号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-27 09:09