C'est pourtant le cas si tu restes en C standard sans utiliser POSIX.
À moins d'invoquer explicitement le handler en appelant raise() depuis le code utilisateur, tu as énormément de restrictions car hors de ce cas, la fonction peut, selon la norme, être invoquée absolument à tout moment.
C'est la différence entre programmation événementielle et programmation interruptible...
Par contre, sous POSIX, ils se sont rendus compte que ça rendait la fonction pratiquement inutile et ont rajouté du code de synchronisation pour avoir une plus grande liberté dans le handler...