gpt4 book ai didi

c - Linux 和实时信号

转载 作者:太空宇宙 更新时间:2023-11-04 07:34:30 24 4
gpt4 key购买 nike

我正在尝试编写在 Linux 中使用实时信号的简单程序。但是我遇到了奇怪的行为,首先是代码:

#include<signal.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include"errhandling.h"
#include<string.h>
#include<errno.h>
#include<unistd.h>

void baz(int sig,siginfo_t* info,void *context)
{
if (sig==SIGUSR1)
printf("SIGUSR1 %d\n",info->si_value.sival_int);
else if(sig==SIGRTMIN)
printf("SIGRTMIN %d\n",info->si_value.sival_int);
else
printf("SIGRTMIN+1 %d\n",info->si_value.sival_int);
return ;
}

void sig_output()
{
sigset_t set;
sigprocmask(0,NULL,&set);
printf("blokowane sa: ");
if (sigismember(&set,SIGUSR1))
printf("SIGUSR1 ");
if(sigismember(&set,SIGUSR2))
printf(" SIGUSR2");
printf("\n");
return ;
}


int received=0;
int usr2=0;

void foo(int sig)
{
return ;
}

void usr1_handler(int sig)
{
printf("usr1_handler\n");
//++received;
}



void usr2_handler(int sig)
{
usr2=1;
}

int main(int argc,char **argv)
{
int i=0;
pid_t pid=getppid();
struct sigaction a;
struct sigaction a2;
a.sa_flags=SA_SIGINFO;
sigset_t set;
sigemptyset(&set);
//sigaddset(&set,SIGRTMAX);
sigemptyset(&(a.sa_mask));
sigemptyset(&(a2.sa_mask));
a.sa_sigaction=baz;
sigaction(SIGRTMIN,&a,NULL);
a2.sa_handler=usr1_handler;
sigaction(SIGRTMIN+1,&a2,NULL);
//sigprocmask(SIG_SET,&(a.sa_mask),NULL);
while(!usr2)
{
printf("while\n");
sigsuspend(&set);

}
//pause()
printf("after while\n");
return EXIT_SUCCESS;
}

当我运行这个程序并且它使用 sigsuspend 进入这个循环并且我向这个程序发送 SIGRTMIN 一切正常 - 处理程序执行并等待另一个信号,但是当我向它发送 SIGRTMIN+1 时我得到了段错误。

似乎对于实时信号我需要使用这个带有 3 个参数的扩展处理程序,但为什么呢?它在某处指定吗?我在我的 friend OpenSUSE 12.1 上运行这个程序,我没有收到 SIGRTMIN+1 的段错误,但是在我的 Xubuntu 11.10 上,当我发送 SIGRTMIN+1 时,我收到段错误。是我的系统有问题吗?还是依赖于实现?

最佳答案

您似乎缺少为 a2.sa_sigaction 分配处理程序。


一般来说,通过原始整数值来引用信号并不是一个好主意,因为各种信号的定义可能是特定于平台的。


更新:确保 struct sigaction 结构已正确初始化,例如通过 memset() 将它们初始化为 0。

关于c - Linux 和实时信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10209063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com