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??