The broad question is: what is wrong with my code so that all generated signals are not caught by two handler threads?
Unfortunate details of my bad question: I have to write code with the main function, 3 generator threads to generate signals like sig1 and sig2 and two signal processing threads. I tried to solve this using the code below, but I am having some errors. I tried using sigaction with sigwaitinfo and sigwait to catch signals. But both methods do not work correctly. Code handler 1 uses sigaction and sigwaitinfo, handler2 uses sigwait. But I tried to use both handlers alone, and my results will never be what I think. It seems that some signals are never caught. What is wrong with my code so that all signals are not caught? Here is an example output
Output example
signal 1 received
Received Signal 2
signal 1 received
Received Signal 2
Received Signal 2
sigSent1 == 2, sigSent2 == 7, sigReceived1 == 2, sigReceived2 == 3
The desired result will be
1
2
1
2
2
1
2
1
2
sigSent1 == 4, sigSent2 == 5, sigReceived1 == 4, sigReceived2 == 5
, , , , 6 3 , ... - ...
#include<semaphore.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<time.h>
#include<signal.h>
#include<string.h>
#include<math.h>
void generator();
void handler1();
void handler2();
void reporter();
int total_signal_count=0;
int sentSignal1=0;
int sentSignal2=0;
int receivedSignal1=0;
int receivedSignal2=0;
sem_t s_lock;
sem_t r_lock;
sigset_t set;
pthread_mutex_t lock;
pthread_t tid[5];
int main(int argc, char ** argv)
{
int i=0;
int randomNum=0;
int error;
int pid;
sigset_t mask_all,mask_one,prev_one;
time_t now;
time(&now);
sem_init(&s_lock,0,1);
sem_init(&r_lock,0,1);
srand((unsigned) time(&now));
sigemptyset(&set);
sigaddset(&set,SIGUSR1);
sigaddset(&set,SIGUSR2);
pthread_sigmask(SIG_BLOCK,&set,NULL);
pthread_sigmask(SIG_BLOCK,&set,NULL);
while(i<3)
{ error=pthread_create(&tid[i],NULL,(void*)generator,NULL);
if(error!=0)
{
printf("failed to create thread\n");
}
i++;
}
while(i<5)
{
error=pthread_create(&tid[3],NULL,(void*)handler1,NULL);
if(error!=0)
{
printf("failed to create thread\n");
}
error=pthread_create(&tid[4],NULL,(void*)handler2,NULL);
if(error!=0)
{
printf("failed to create thread \n");
}
i++;
}
i=0;
int returnVal;
sleep(10);
printf("\n sigSent1==%d,sigSent2==%d,sigReceived1==%d,sigReceived2==%d\n",sentSignal1,sentSignal2,receivedSignal1,receivedSignal2);
while(i<5)
{
pthread_join(tid[i],NULL);
i++;
}
return 0;
}
void generator()
{
sleep(1);
int i=3;
int randomNum=0;
int val=0;
int total_signal_c=9997;
while(total_signal_c<10000)
{
usleep(1);
randomNum=rand()%2;
switch(randomNum)
{
case 0:
val=pthread_kill(tid[3],SIGUSR1);
if(val!=0)
{
printf("kill fail ==%d\n",val);
}
sem_wait(&s_lock);
sentSignal1++;
sem_post(&s_lock);
break;
case 1:
val=pthread_kill(tid[4],SIGUSR2);
if(val!=0)
{
printf("kill fail2\n");
}
sem_wait(&s_lock);
sentSignal2++;
sem_post(&s_lock);
break;
}
i++;
total_signal_c++;
}
}
void handler1()
{
struct sigaction s;
siginfo_t info;
sigemptyset(&s.sa_mask);
signal(SIGUSR2,handler1);
sigaddset((&s.sa_mask),SIGUSR1);
pthread_sigmask(SIG_BLOCK,&s.sa_mask,NULL);
int val=-1;
while(1)
{
val=-1;
val=sigwaitinfo(&s.sa_mask,&info);
if(info.si_signo==SIGUSR1){
sem_wait(&r_lock);
receivedSignal1++;
sem_post(&r_lock);
printf("signal 1 received\n");
}
if(val==-1)
{
}
}
pthread_exit(NULL);
}
void handler2()
{
int sigInfo=0;
signal(SIGUSR1,handler2);
int val=-1;
while(1)
{
val=-1;
val=sigwait(&set,&sigInfo);
if(sigInfo==SIGUSR2){
sem_wait(&r_lock);
receivedSignal2++;
sem_post(&r_lock);
printf("signal 2 received\n");
}
}
pthread_exit(NULL);
}