How does the compiler or OS distinguish between sig_atomic_t type and a normal int type variable, and ensures that the operation will be atomic? Programs using both have same assembler code. How extra care is taken to make the operation atomic?
sig_atomic_t
is not an atomic data type. It is just the data type that you are allowed to use in the context of a signal handler, that is all. So better read the name as "atomic relative to signal handling".
To guarantee communication with and from a signal handler, only one of the properties of atomic data types is needed, namely the fact that read and update will always see a consistent value. Other data types (such as perhaps long long
) could be written with several assembler instructions for the lower and higher part, e.g. sig_atomic_t
is guaranteed to be read and written in one go.
So a platform may choose any integer base type as sig_atomic_t
for which it can make the guarantee that volatile sig_atomic_t
can be safely used in signal handlers. Many platforms chose int
for this, because they know that for them int
is written with a single instruction.
The latest C standard, C11, has atomic types, but which are a completely different thing. Some of them (those that are "lockfree") may also be used in signal handlers, but that again is a completely different story.