signal-safety(7)
signal-safety(7) – Asynkront signal-säkra funktioner
NAMN
signal-safety - asynkront signal-säkra funktioner
BESKRIVNING
En asynkront signal-säker funktion är en som säkert kan anropas från en signalhanterare. Många funktioner är inte asynkront signal-säkra. I synnerhet är icke-återinträdesbara funktioner generellt osäkra att anropa från en signalhanterare.
De typer av problem som gör en funktion osäker kan snabbt förstås när man betraktar implementeringen av stdio-biblioteket, vars alla funktioner inte är asynkront signal-säkra.
När man utför buffrad I/O på en fil måste stdio-funktionerna underhålla en statiskt allokerad databuffert tillsammans med associerade räknare och index (eller pekare) som registrerar mängden data och den aktuella positionen i bufferten. Antag att huvudprogrammet är mitt i ett anrop till en stdio-funktion som printf(3), där bufferten och associerade variabler har uppdaterats delvis. Om programmet i det ögonblicket avbryts av en signalhanterare som också anropar printf(3), kommer det andra anropet till printf(3) att arbeta på inkonsekventa data, med oförutsägbara resultat.
För att undvika problem med osäkra funktioner finns två möjliga val:
(a) Säkerställ att (1) signalhanteraren endast anropar asynkront signal-säkra funktioner, och (2) signalhanteraren själv är återinträdesbar med avseende på globala variabler i huvudprogrammet.
(b) Blockera signalleverans i huvudprogrammet när man anropar funktioner som är osäkra eller arbetar på globala data som också åtkomstas av signalhanteraren.
Generellt är det andra valet svårt i program av någon komplexitet, så det första valet föredras.
POSIX.1 specificerar en uppsättning funktioner som en implementering måste göra asynkront signal-säkra. (En implementering kan tillhandahålla säkra implementationer av ytterligare funktioner, men detta krävs inte av standarden och andra implementeringar kanske inte ger samma garantier.)
Generellt är en funktion asynkront signal-säker antingen för att den är återinträdesbar eller för att den är atomisk med avseende på signaler (dvs. dess exekvering kan inte avbrytas av en signalhanterare).
Uppsättningen av funktioner som enligt POSIX.1 krävs vara asynkront signal-säkra visas i följande tabell. Funktionerna som inte annars nämns krävdes vara asynkront signal-säkra i POSIX.1-2001; tabellen detaljerar förändringar i efterföljande standarder.
Funktion | Noteringar
|-----------------------------
abort(3) | Tillagd i POSIX.1-2001 TC1 accept(2) | access(2) | aio_error(3) | aio_return(3) | aio_suspend(3) | Se noteringar nedan alarm(2) | bind(2) | cfgetispeed(3) | cfgetospeed(3) | cfsetispeed(3) | cfsetospeed(3) | chdir(2) | chmod(2) | chown(2) | clock_gettime(2) | close(2) | connect(2) | creat(2) | dup(2) | dup2(2) | execl(3) | Tillagd i POSIX.1-2008; se noteringar nedan execle(3) | Se noteringar nedan execv(3) | Tillagd i POSIX.1-2008 execve(2) | \_exit(2) | \_Exit(2) | faccessat(2) | Tillagd i POSIX.1-2008 fchdir(2) | Tillagd i POSIX.1-2008 TC1 fchmod(2) | fchmodat(2) | Tillagd i POSIX.1-2008 fchown(2) | fchownat(2) | Tillagd i POSIX.1-2008 fcntl(2) | fdatasync(2) | fexecve(3) | Tillagd i POSIX.1-2008 ffs(3) | Tillagd i POSIX.1-2008 TC2 fork(2) | Se noteringar nedan fstat(2) | fstatat(2) | Tillagd i POSIX.1-2008 fsync(2) | ftruncate(2) | futimens(3) | Tillagd i POSIX.1-2008 getegid(2) | geteuid(2) | getgid(2) | getgroups(2) | getpeername(2) | getpgrp(2) | getpid(2) | getppid(2) | getsockname(2) | getsockopt(2) | getuid(2) | htonl(3) | Tillagd i POSIX.1-2008 TC2 htons(3) | Tillagd i POSIX.1-2008 TC2 kill(2) | link(2) | linkat(2) | Tillagd i POSIX.1-2008 listen(2) | longjmp(3) | Tillagd i POSIX.1-2008 TC2; se noteringar nedan lseek(2) | lstat(2) | memccpy(3) | Tillagd i POSIX.1-2008 TC2 memchr(3) | Tillagd i POSIX.1-2008 TC2 memcmp(3) | Tillagd i POSIX.1-2008 TC2 memcpy(3) | Tillagd i POSIX.1-2008 TC2 memmove(3) | Tillagd i POSIX.1-2008 TC2 memset(3) | Tillagd i POSIX.1-2008 TC2 mkdir(2) | mkdirat(2) | Tillagd i POSIX.1-2008 mkfifo(3) | mkfifoat(3) | Tillagd i POSIX.1-2008 mknod(2) | Tillagd i POSIX.1-2008 mknodat(2) | Tillagd i POSIX.1-2008 ntohl(3) | Tillagd i POSIX.1-2008 TC2 ntohs(3) | Tillagd i POSIX.1-2008 TC2 open(2) | openat(2) | Tillagd i POSIX.1-2008 pause(2) | pipe(2) | poll(2) | posix_trace_event(3)| pselect(2) | pthread_kill(3) | Tillagd i POSIX.1-2008 TC1 pthread_self(3) | Tillagd i POSIX.1-2008 TC1 pthread_sigmask(3) | Tillagd i POSIX.1-2008 TC1 raise(3) | read(2) | readlink(2) | readlinkat(2) | Tillagd i POSIX.1-2008 recv(2) | recvfrom(2) | recvmsg(2) | rename(2) | renameat(2) | Tillagd i POSIX.1-2008 rmdir(2) | select(2) | sem_post(3) | send(2) | sendmsg(2) | sendto(2) | setgid(2) | setpgid(2) | setsid(2) | setsockopt(2) | setuid(2) | shutdown(2) | sigaction(2) | sigaddset(3) | sigdelset(3) | sigemptyset(3) | sigfillset(3) | sigismember(3) | siglongjmp(3) | Tillagd i POSIX.1-2008 TC2; se noteringar nedan signal(2) | sigpause(3) | sigpending(2) | sigprocmask(2) | sigqueue(2) | sigset(3) | sigsuspend(2) | sleep(3) | sockatmark(3) | Tillagd i POSIX.1-2001 TC2 socket(2) | socketpair(2) | stat(2) | stpcpy(3) | Tillagd i POSIX.1-2008 TC2 stpncpy(3) | Tillagd i POSIX.1-2008 TC2 strcat(3) | Tillagd i POSIX.1-2008 TC2 strchr(3) | Tillagd i POSIX.1-2008 TC2 strcmp(3) | Tillagd i POSIX.1-2008 TC2 strcpy(3) | Tillagd i POSIX.1-2008 TC2 strcspn(3) | Tillagd i POSIX.1-2008 TC2 strlen(3) | Tillagd i POSIX.1-2008 TC2 strncat(3) | Tillagd i POSIX.1-2008 TC2 strncmp(3) | Tillagd i POSIX.1-2008 TC2 strncpy(3) | Tillagd i POSIX.1-2008 TC2 strnlen(3) | Tillagd i POSIX.1-2008 TC2 strpbrk(3) | Tillagd i POSIX.1-2008 TC2 strrchr(3) | Tillagd i POSIX.1-2008 TC2 strspn(3) | Tillagd i POSIX.1-2008 TC2 strstr(3) | Tillagd i POSIX.1-2008 TC2 strtok_r(3) | Tillagd i POSIX.1-2008 TC2 symlink(2) | symlinkat(2) | Tillagd i POSIX.1-2008 tcdrain(3) | tcflow(3) | tcflush(3) | tcgetattr(3) | tcgetpgrp(3) | tcsendbreak(3) | tcsetattr(3) | tcsetpgrp(3) | time(2) | timer_getoverrun(2)| timer_gettime(2) | timer_settime(2) | times(2) | umask(2) | uname(2) | unlink(2) | unlinkat(2) | Tillagd i POSIX.1-2008 utime(2) | utimensat(2) | Tillagd i POSIX.1-2008 utimes(2) | Tillagd i POSIX.1-2008 wait(2) | waitpid(2) | wcpcpy(3) | Tillagd i POSIX.1-2008 TC2 wcpncpy(3) | Tillagd i POSIX.1-2008 TC2 wcscat(3) | Tillagd i POSIX.1-2008 TC2 wcschr(3) | Tillagd i POSIX.1-2008 TC2 wcscmp(3) | Tillagd i POSIX.1-2008 TC2 wcscpy(3) | Tillagd i POSIX.1-2008 TC2 wcscspn(3) | Tillagd i POSIX.1-2008 TC2 wcslen(3) | Tillagd i POSIX.1-2008 TC2 wcsncat(3) | Tillagd i POSIX.1-2008 TC2 wcsncmp(3) | Tillagd i POSIX.1-2008 TC2 wcsncpy(3) | Tillagd i POSIX.1-2008 TC2 wcsnlen(3) | Tillagd i POSIX.1-2008 TC2 wcspbrk(3) | Tillagd i POSIX.1-2008 TC2 wcsrchr(3) | Tillagd i POSIX.1-2008 TC2 wcsspn(3) | Tillagd i POSIX.1-2008 TC2 wcsstr(3) | Tillagd i POSIX.1-2008 TC2 wcstok(3) | Tillagd i POSIX.1-2008 TC2 wmemchr(3) | Tillagd i POSIX.1-2008 TC2 wmemcmp(3) | Tillagd i POSIX.1-2008 TC2 wmemcpy(3) | Tillagd i POSIX.1-2008 TC2 wmemmove(3) | Tillagd i POSIX.1-2008 TC2 wmemset(3) | Tillagd i POSIX.1-2008 TC2 write(2) |
- Noteringar:**
- POSIX.1-2001 och POSIX.1-2001 TC2 krävde att funktionerna fpathconf(3), pathconf(3) och sysconf(3) skulle vara asynkront signal-säkra, men detta krav togs bort i POSIX.1-2008.
- Om en signalhanterare avbryter exekveringen av en osäker funktion, och hanteraren terminerar via ett anrop till longjmp(3) eller siglongjmp(3) och programmet därefter anropar en osäker funktion, är programmets beteende odefinierat.
- POSIX.1-2001 TC1 klargjorde att om en applikation anropar fork(2) från en signalhanterare och någon av de fork-hanterare som registrerats av pthread_atfork(3) anropar en funktion som inte är asynkront signal-säker, är beteendet odefinierat. En framtida revision av standarden kommer sannolikt att ta bort fork(2) från listan över asynkront signal-säkra funktioner.
- Asynkrona signalhanterare som anropar funktioner som är avbrottspunkter och nestas över regioner med uppskjuten avbrottshantering kan utlösa avbrott vars beteende är som om asynkront avbrott hade inträffat och kan orsaka att applikationens tillstånd blir inkonsekvent.
errno
Att hämta och ställa in värdet av `errno` är asynkront signal-säkert förutsatt att signalhanteraren sparar `errno` vid inträde och återställer dess värde innan den återvänder.
Avvikelser i GNU C-biblioteket
Följande kända avvikelser från standarden förekommer i GNU C-biblioteket:
- Före glibc 2.24 använde execl(3) och execle(3) internt realloc(3), och var därför inte asynkront signal-säkra. Detta åtgärdades i glibc 2.24.
- Glibc-implementeringen av aio_suspend(3) är inte asynkront signal-säker eftersom den använder pthread_mutex_lock(3) internt.
SEE ALSO
sigaction(2), signal(7), standards(7)
COLOFON
Denna sida är en del av man-sidorna (Linux-kärnans och C-bibliotekets användarutrymmesgränssnitts-dokumentation) projekt. Information om projektet finns på ⟨https://www.kernel.org/doc/man-pages/⟩. Om du har en felrapport för denna man-sida, se ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩. Denna sida erhölls från tarballen `man-pages-6.9.1.tar.gz` hämtad från ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩ den 2024-06-26. Om du upptäcker några återgivningsproblem i denna HTML-version av sidan, eller om du tror att det finns en bättre eller mer uppdaterad källa för sidan, eller om du har korrigeringar eller förbättringar av informationen i denna COLOFON (som inte är en del av den ursprungliga man-sidan), skicka ett mail till man-pages@man7.org
Linux man-sidor 6.9.1 2024-05-02 signal-safety(7)
Sidor som hänvisar till denna sida
fork(2), sigaction(2), signal(2), pthread_atfork(3), sd_journal_get_fd(3), sd_journal_print(3), sd_journal_stream_fd(3), seccomp_load(3), seccomp_precompute(3), sem_post(3), setjmp(3), strerror(3), attributes(7), signal(7)
Sidslut
Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man7/capabilities.7.html
Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på
https://www.linux.se/kontaka-linux-se/
Tack till Datorhjälp som har sponsrat Linux.se med webbhotell.