SIGNAL(2) Linux - příručka programátora SIGNAL(2)

signal - práce se signály v ANSI C

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

WARNING: the behavior of signal() varies across UNIX versions, and has also varied historically across different versions of Linux. Avoid its use: use sigaction(2) instead. See Portability below.

Systémové volání signal() instaluje novou obslužnou funkci pro signál s číslem signum. Obsluha signálu je nastavena na handler, což může být uživatelsky definovaná funkce nebo SIG_IGN případně SIG_DFL.

Pokud je signál signum přijat procesem, stane se jedna z následujících věcí:

*
Je-li nastaveno SIG_IGN signál je ignorován.
*
If the disposition is set to SIG_DFL, then the default action associated with the signal (see signal(7)) occurs.
*
Pokud je dispozice nastavena na funkci, pak je nejdřív buď znovu nastavena dispozice na SIG_DFL nebo je signál blokován (viz Přenositelnost níže) a obslužná funkce je volána s parametrem signum. Pokud volání funkce zablokovalo signál, je signál odblokován při návratu z obslužné funkce.

Signály SIGKILL a SIGSTOP nemohou být odchyceny nebo blokovány.

signal() returns the previous value of the signal handler On failure, it returns SIG_ERR, and errno is set to indicate the error.

EINVAL
signum je neplatný.

POSIX.1-2001, POSIX.1-2008, C89, C99.

Efekt funkce signal() v procesech s vlákny nejsou specifikovány.

Dle specifikace POSIX je chování systému nespecifikováno, pokud ignoruje SIGFPE, SIGILL nebo SIGSEGV signál pokud nebyl vyvolán pomocí kill(2) nebo raise(3). Celočíselné dělení nulou má nedefinovaný výsledek. Na některých architekturách se generuje SIGFRE signál. (Také dělení největšího záporného celého čísla -1 generuje SIGFRE). Ignorování tohoto signálu může vést k nekonečné smyčce.

See sigaction(2) for details on what happens when the disposition SIGCHLD is set to SIG_IGN.

Viz signal-safety(7) pro seznam asynchronních bezpečných funkcí, které mohou být bezpečně volány uvnitř funkce pro obsluhu signálu.

The use of sighandler_t is a GNU extension, exposed if _GNU_SOURCE is defined; glibc also defines (the BSD-derived) sig_t if _BSD_SOURCE (glibc 2.19 and earlier) or _DEFAULT_SOURCE (glibc 2.19 and later) is defined. Without use of such a type, the declaration of signal() is the somewhat harder to read:


void ( *signal(int signum, void (*handler)(int)) ) (int);

Jediné přenositelné použití funkce signal() je nastavit obsluhu signálu na SIG_DFL nebo SIG_IGN. Sémantika použití signal() na nastavení obsluhy signálu se liší na různých systémech (a POSIX.1 tot explicitně podporuje). Proto jej nepoužívejte za tímto účelem.

POSIX.1 vyřešil tento nesoulad v přenositelnosti zavedením sigaction(2), který poskytuje explicitní kontrolu sémantiky v případě vyvolání obsluhy signálu. Používejte jej proto místo signal()u.

In the original UNIX systems, when a handler that was established using signal() was invoked by the delivery of a signal, the disposition of the signal would be reset to SIG_DFL, and the system did not block delivery of further instances of the signal. This is equivalent to calling sigaction(2) with the following flags:


sa.sa_flags = SA_RESETHAND | SA_NODEFER;

System V also provides these semantics for signal(). This was bad because the signal might be delivered again before the handler had a chance to reestablish itself. Furthermore, rapid deliveries of the same signal could result in recursive invocations of the handler.

BSD improved on this situation, but unfortunately also changed the semantics of the existing signal() interface while doing so. On BSD, when a signal handler is invoked, the signal disposition is not reset, and further instances of the signal are blocked from being delivered while the handler is executing. Furthermore, certain blocking system calls are automatically restarted if interrupted by a signal handler (see signal(7)). The BSD semantics are equivalent to calling sigaction(2) with the following flags:


sa.sa_flags = SA_RESTART;

Situace na Linuxu je následující:

  • Systémové volání jádra signal() poskytuje System V sémantiku.
  • By default, in glibc 2 and later, the signal() wrapper function does not invoke the kernel system call. Instead, it calls sigaction(2) using flags that supply BSD semantics. This default behavior is provided as long as a suitable feature test macro is defined: _BSD_SOURCE on glibc 2.19 and earlier or _DEFAULT_SOURCE in glibc 2.19 and later. (By default, these macros are defined; see feature_test_macros(7) for details.) If such a feature test macro is not defined, then signal() provides System V semantics.

kill(1), alarm(2), kill(2), pause(2), sigaction(2), signalfd(2), sigpending(2), sigprocmask(2), sigsuspend(2), bsd_signal(3), killpg(3), raise(3), siginterrupt(3), sigqueue(3), sigsetops(3), sigvec(3), sysv_signal(3), signal(7)

Tato stránka je součástí projektu Linux man-pages v5.11. Popis projektu a informace o hlášení chyb najdete na https://www.kernel.org/doc/man-pages/.

Překlad této příručky do španělštiny vytvořili Marek Kubita <Kubitovi@mbox.lantanet.cz> a Pavel Heimlich <tropikhajma@gmail.com>

Tento překlad je bezplatná dokumentace; Přečtěte si GNU General Public License Version 3 nebo novější ohledně podmínek autorských práv. Neexistuje ŽÁDNÁ ODPOVĚDNOST.

Pokud narazíte na nějaké chyby v překladu této příručky, pošlete e-mail na adresu translation-team-cs@lists.sourceforge.net.

22. března 2021 Linux