mit sigprocmask und sighandler gleichzeitig arbeiten
Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
SIGNALBEHANDLUNG
Hallo ich versuche die Signalbehandlung in C zu verstehen und habe ein kleines Programm geschrieben. Nur leider funktioniert es nicht so wie es soll. Kann mir vielleicht jemand sagen weshalb das Programm tut was es tut ?
An sich moechte ich zunaechst einen Signalhandler fuer SIGINT erstellen. Wird dieser 5 mal aufgerufen soll SIGINT mittels sigprocmask BLOCKIERT werden.
Ich versuche bewusst mit sigprocmask zu arbeiten weil ich sowohl sigsuspend, sigprocmask als auch mit sigaction umgehen koennen und verstehen moechte.
Es waere sehr nett wenn mir jemand helfen koennte.
// Es ist auch ein kleiner bug im Programm… manchmal schliesst sich das Programm beim zweiten SIGINT manchmal gehts ewig. … vielleicht kann mir das auch jemand erklaeren
Mein Programm schaut wie folgt aus.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void myhandler();
void sigusr1handler();
static int counter=0;
int main()
{
fprintf(stdout,"My process id is %i\n", getpid());
struct sigaction sigact;
sigset_t maske;
/***** Handler SIGUSR1 ********/
struct sigaction newstruct;
sigset_t anothermask;
if(sigfillset(&anothermask)){
perror("sigfillset");
exit(EXIT_FAILURE);
}
newstruct.sa_handler=sigusr1handler;
newstruct.sa_mask=anothermask;
if(sigaction(SIGUSR1,&newstruct,NULL)){
perror("sigaction");
exit(EXIT_FAILURE);
}
if(sigfillset(&maske))
{
perror("sigfillset");
exit(EXIT_FAILURE);
}
if(sigdelset(&maske,SIGUSR1))
{
perror("sigdelset");
exit(EXIT_FAILURE);
}
fprintf(stdout,"Going to sleep now till SIGUSR1 wakes me up\n");
sigsuspend(&maske);
fprintf(stdout,"SIGSUSPEND RECEIVED SIGUSR1\n");
sigact.sa_handler=myhandler;
if(sigfillset(&maske))
{
perror("sigfillset");
exit(EXIT_FAILURE);
}
sigact.sa_mask=maske;
if(sigaction(SIGINT,&sigact,NULL))
{
perror("sigaction");
exit(EXIT_FAILURE);
}
fprintf(stdout,"While reached\n");
while(1)
{
}
exit(EXIT_SUCCESS);
}
void myhandler()
{
fprintf(stdout,"SIGINT received zum %i. mal\n",++counter);
if(counter>5){
sigset_t samask;
if(sigaddset(&samask,SIGINT)){
perror("sigaddset");
exit(EXIT_FAILURE);
}
if(sigprocmask(SIG_SETMASK,&samask,NULL)){
perror("sigprocmask");
exit(EXIT_FAILURE);
}
fprintf(stdout,"5 mal SIGINT erhalten... SIGINT ist jetzt blockiert!\nHandler wird nicht mehr aufgerufen\n");
}
}
void sigusr1handler(){
fprintf(stdout,"SIGUSR1 received/n");
}