Signals

What Are Signals?

Signals are a form of inter-process communication (IPC) in Posix compliant systems like Linux, UNIX, and UNIX-like operating systems. They are an asynchronous mechanism the kernel uses to communicate with a process or a thread. Signals are always delivered by the kernel but can be initiated by the kernel, the process itself, or even another process. Signals are often referred to by their name, or their numeric integer value. For example, the kill signal is known as SIGKILL, or 9. There are many different signals that can be sent, although the signals in which users are generally most interested are SIGTERM and SIGKILL. The default signal sent is SIGTERM.

How Do Signals Work?

When a process receives a signal, what happens depends on the program. In the simplest case the process will just apply the default signal handlers defined in the C library. In most cases this will cause the program to terminate, suspend, and occasionally it will ignore the signal.

In some cases, programs have custom signal handlers. Programs that have custom signal handlers will behave differently when they receive a signal. For example many service daemons will reload their configurations when they receive the SIGHUP signal; the default action for SIGHUP is for the program to terminate.

In either case, when the kernel sends a signal to a process, the process will execute its signal handler immediately. Processes can enter states in which they are executing atomic instructions(like file locks), and will not process the signal until the instruction is completed.

How To Send a Signal to a Program

There are three ways to send a signal to another process. The simplest way is the execute the “kill” command with a signal specified. For example you can use the kill command from the shell to send the interrupt signal like so:

kill -SIGINT <PID>

You can write a simple program executing the kill system call. A basic example is below:

int signal_pid(int pid) {
  int rvalue;
  rvalue = kill(pid, SIGINT);
  return rvalue;
}

Lastly you can send signals from the keyboard in an interactive terminal. Ctrl-C will send SIGINT, and Ctrl-Z send SIGTSTP.

List Of Posix 1990 Signals

Signal

Value

Action

Comment

SIGHUP

1

Term

Hangup detected on controlling terminal or death of controlling process

SIGINT

2

Term

Interrupt from keyboard

SIGQUIT

3

Core

Quit from keyboard

SIGILL

4

Core

Illegal Instruction

SIGABRT

6

Core

Abort signal from abort(3)

SIGFPE

8

Core

Floating point exception

SIGKILL

9

Term

Kill signal

SIGSEGV

11

Core

Invalid memory reference

SIGPIPE

13

Term

Broken pipe: write to pipe with no readers

SIGALRM

14

Term

Timer signal from alarm(2)

SIGTERM

15

Term

Termination signal (signal sent by default by the kill command when not specified)

SIGUSR1

30,10,16

Term

User-defined signal 1

SIGUSR2

31,12,17

Term

User-defined signal 2

SIGCHLD

20,17,18

Ign

Child stopped or terminated

SIGCONT

19,18,25

Cont

Continue if stopped

SIGSTOP

17,19,23

Stop

Stop process

SIGTSTP

18,20,24

Stop

Stop typed at tty

SIGTTIN

21,21,26

Stop

tty input for background process

SIGTTOU

22,22,27

Stop

tty output for background process