Linux Signals Riddle!

Playing with signals in linux lets see a riddle :

#include
#include
/* for random() stuff */
#include
#include
#include
#include

void
termination_handler (int signum)
{
struct temp_file *p;
int err;
printf("\nTerminated\n");
sleep(10);
}

int
main (void)
{

int shmfd,*shared_msg, pid;
struct sigaction new_action, old_action;
int shared_seg_size = (1 * sizeof(int));
//shm operations
shmfd = shm_open("/shm_sumit",O_CREAT|O_RDWR|O_EXCL,S_IRWXU | S_IRWXG);
if (shmfd < 0) {
perror("In shm_open()");
exit(1);
}

ftruncate(shmfd, shared_seg_size);
shared_msg = (int *)mmap(NULL, shared_seg_size, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
if (shared_msg == NULL) {
perror("In mmap()");
exit(1);
}

pid = getpid();
*shared_msg = pid;

/* Set up the structure to specify the new action. */
new_action.sa_handler = termination_handler;
sigemptyset (&new_action.sa_mask);
new_action.sa_flags = SA_NODEFER;

sigaction (SIGUSR1, &new_action, NULL);
//while(1)
{
sleep(10);
}
/*if (shm_unlink("/shm_sumit") != 0) {
perror("In shm_unlink()");
exit(1);
}*/

}



signal2.c


#include
#include
#include
void
termination_handler (int signum)
{
struct temp_file *p;
printf("\nTerminated");
}

int
main (void)
{
int shmfd,*shared_msg, pid;
struct sigaction new_action, old_action;
int shared_seg_size = (1 * sizeof(int));
//shm operations
shmfd = shm_open("/shm_sumit",O_RDWR,S_IRWXU | S_IRWXG);
shared_msg = (int *)mmap(NULL, shared_seg_size, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
printf(" Process id of sigtest1 = %d\n",*shared_msg);
kill(*shared_msg,SIGUSR1);
kill(*shared_msg,SIGUSR1);
kill(*shared_msg,SIGUSR1);
kill(*shared_msg,SIGUSR1);
kill(*shared_msg,SIGUSR1);

sleep(1);
if (shm_unlink("/shm_sumit") != 0) {
perror("In shm_unlink()");
exit(1);
}

}


The riddle is here sigtest2.c send SIGUSR1 to sigtest1.c 5 times, but the string "Terminated " gets printed sometimes 2 times and sometimes 5 times. why is this printing behavior inconsistent??

0 comments: