如何在 ac 程序(在 Linux 上)中接收用 sigqueue 发送的信号?

发布于 2024-09-24 10:56:33 字数 1010 浏览 4 评论 0原文

如何在 ac 程序(在 Linux 上)中接收用 sigqueue 发送的信号?

如果只是使用kill来发送信号,我只需添加一个接收器,其中包含类似这样的东西

signal(SIGUSR1,  sigusr1);

,该接收器指向这样一个简单的函数:

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

但是如果我使用sigqueue发送信号,那么我会怎么做?

谢谢 Johan


添加一个 sigaction:

struct sigaction action;

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

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

sigusr2 看起来像这样:

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);
}

仅供参考 sigqueue 示例

sigval value;

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

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?

Thanks
Johan


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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文