Also available in: Español · Português · Français · العربية
Linux signal numbers
Every signal's number on five platforms, the reverse lookup for a bare number, and the reason the numbers disagree at all.
What are signal numbers?
A signal is how a Unix system interrupts a running process: to ask it to stop, to tell it a child has exited, to report that it touched memory it should not have. Each one has a name like SIGTERM and a small integer, and kill sends one by either. The names are fixed by POSIX. The numbers are not.
That is the whole difficulty. POSIX standardises which signals exist and what they mean, and leaves the numbering to the implementation — so the table below has five columns, one per platform, and a great many rows where they disagree.
This page carries all 39 signals from the Linux manual and Apple's own header, with the number each platform assigns, whether POSIX standardises it, and what the default action does if you do not handle it. Above the table is the control that matters most: type a bare number and it tells you what that number means everywhere.
How to use it
- Start with the number, if that is what you have. Type it into the lookup and you get the signal it names on each platform, and a warning if those disagree. That is the direction a log line or a shell exit status leaves you in.
- Search by name, number or description. SIGKILL, kill, 9 and pipe all work, and an exact name comes first rather than being buried under everything that merely contains those letters.
- Read the whole row. The default action tells you what happens if your program ignores the signal, and absent means the signal does not exist there at all — a different fact from having a different number.
Why the numbers disagree, and why it is not random
The famous example is SIGUSR1. It is 10 on x86 and ARM, 30 on Alpha and SPARC, and 16 on MIPS and PA-RISC — three different numbers for one name, and all of them Linux. The divergence is not between operating systems, it is between architectures of the same one.
Stated that way it sounds like a nuisance. Stated the other way round it is a hazard: the same number means different signals. Ten is SIGUSR1 on x86 and SIGBUS on almost everything else, so a script or a piece of code that hard-codes 10 does not fail loudly when it runs somewhere unexpected. It sends a bus error to a process that was expecting a user-defined signal, and the process dies in a way nobody wrote a handler for.
The reassuring part is that the disagreement has a shape. Of the 31 signals that both the Linux manual and Apple's header define, macOS agrees with the Alpha and SPARC column on every single one, and with x86 on only 19. macOS and those architectures descend from BSD; Linux on x86 followed the System V numbering instead. So there are really two families here, and one column of the Linux table is the BSD column wearing a different label.
A handful of numbers are the same everywhere, which is why they are the ones people remember: 1 is always SIGHUP, 2 always SIGINT, 9 always SIGKILL, 15 always SIGTERM. Those four are safe to hard-code. Almost nothing else is.
Honest limits
Five platforms is not every platform. The Linux manual documents four architecture groupings and Apple documents macOS; the other BSDs, Solaris, AIX and the rest have their own headers and are not shown here. Since the whole point of the page is that numbers vary, treat an absence as unknown rather than as agreement — the safe conclusion from this table is always to use the name.
The table also stops before real-time signals. Those run from SIGRTMIN to SIGRTMAX, they have no individual names, and SIGRTMIN itself is not a constant — the C library claims some of the low ones for its own use, so the value differs between systems and even between library versions. A number in that range cannot be looked up in any table, which is a stronger version of the same warning.
And signal numbers are not exit codes, though they meet there. A shell reports a process killed by signal N as exit status 128 plus N, so an exit status of 137 means signal 9 on a platform where 9 is SIGKILL. That arithmetic is the shell's convention rather than part of the signal, and it inherits the same portability problem.
The data is read from the Linux signal(7) manual page and from Apple's xnu header rather than from another table, and the date it was read is printed under the list.
Why is it free?
Because it costs nothing to run. The table is part of the page and the lookup happens in your browser; nothing is uploaded and no server sees what you searched for.
The script that reads both sources is committed alongside the data it produces, and the tests assert the numbers and the family-tree measurement by name, so a bad row fails the build rather than reaching the page.