All about Linux signals
Table of Contents:
- All about Linux signals
- Introduction
- What is signaled, signal handlers
- Handling specific signals: SIGCHLD, SIGBUS, SIGSEGV, SIGABRT
- What happens when a process receives a signal, system call interruption
- Blocking signals
- Waiting for a signal
- Sending signals
- Real-time signals
- Signals and fork()
- Signals and threads
- Other uses of signals
- That's not everything!
In most cases if you want to handle a signal in your application you write a simple signal handler like:
void handler (int sig)
and use the signal(2) system function to run it when a signal is delivered to the process. This is the simplest case, but signals are more interesting than that! Information contained in this article is useful for example when you are writing a daemon and must handle interrupting your program properly without interrupting the current operation or the whole program.

Comments
Thanks
Ctrl+Z Signal
Hi, typo jerk here
Thanks. I don't consider it
I was looking for linux
Great write-up
Signals - That's not everything
Problem regarding signals.
#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); } }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??