signal(2) | System Calls Manual | signal(2) |
signal - práce se signály v ANSI C
Standardní knihovna C (libc, -lc)
#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í:
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.
POSIX.1-2001, POSIX.1-2008, 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í:
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)
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.
5. února 2023 | Linux man-pages 6.03 |