Я пытаюсь написать простую программу, которая использует сигналы реального времени в Linux. Но я столкнулся странное поведение, первый код: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, я получаю ошибку сегментации.
Кажется, что для сигналов в реальном времени мне нужно использовать этот расширенный обработчик с тремя аргументами, но почему? Он определен где-то? Я запускаю эту программу у своего друга OpenSUSE 12.1, и я не получаю ошибку сегментации для SIGRTMIN + 1, но на моем Xubuntu 11.10, когда я отправляю SIGRTMIN + 1, я получаю ошибку сегментации. Это проблема с моей системой? Или это зависит от реализации?
Урок 1: не используйте Е() в обработчике сигнала. – wildplasser
Я знаю об этом - это только из-за разочарования, потому что я хотел получить некоторую информацию - если он войдет в мои обработчики сигналов. – Andna
Замените его на vsnprintf() в локальный буфер и write(), и вы, вероятно, будете в порядке. – wildplasser