attributes(7): Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
(Skapade sidan med '== attributes(7) == === NAMN === '''attributes''' - POSIX-säkerhetskoncept === BESKRIVNING === '''Obs:''' Texten i denna man-sida är baserad på material hämtat från avsnittet "POSIX-säkerhetskoncept" i GNU C Library-manualen. Ytterligare information om ämnena som beskrivs här finns i den manualen. Flera funktionsmanualsidor innehåller ett avsnitt '''ATTRIBUTES''' som beskriver hur säkert det är att anropa funktionen i olika sammanhang. Detta avsnitt markera...')
 
Rad 59: Rad 59:
* [[signal-safety(7)]]
* [[signal-safety(7)]]


=== COLOPHON ===
= attributes(7) – Diverse informationsmanual =
Denna sida är en del av projektet '''man-pages''' (Linuxkärnan och C-bibliotekets gränssnittsdokumentation). Mer information finns på: 
[https://www.kernel.org/doc/man-pages/ kernel.org/doc/man-pages] 


'''Linux man-pages 6.9.1 — 2024-05-02 — attributes(7)'''
== NAMN ==
'''attributes''' – POSIX säkerhetskoncept


Sidor som refererar till denna sida
== BESKRIVNING ==
**[[adjtimex(2)]]**, **[[clock_getres(2)]]**, **[[eventfd(2)]]**, **[[getrlimit(2)]]**, **[[getrusage(2)]]**, **[[mmap(2)]]**, **[[sigaltstack(2)]]**, **[[utimensat(2)]]**, **[[a64l(3)]]**, **[[abort(3)]]**, **[[abs(3)]]**, **[[acos(3)]]**, **[[acosh(3)]]**, **[[addseverity(3)]]**, **[[adjtime(3)]]**, **[[aio_cancel(3)]]**, **[[aio_error(3)]]**, **[[aio_fsync(3)]]**, **[[aio_read(3)]]**, **[[aio_return(3)]]**, **[[aio_suspend(3)]]**, **[[aio_write(3)]]**, **[[alloca(3)]]**, **[[arc4random(3)]]**, **[[argz_add(3)]]**, **[[asin(3)]]**, **[[asinh(3)]]**, **[[asprintf(3)]]**, **[[assert(3)]]**, **[[assert_perror(3)]]**, **[[atan2(3)]]**, **[[atan(3)]]**, **[[atanh(3)]]**, **[[atexit(3)]]**, **[[atof(3)]]**, **[[atoi(3)]]**, **[[backtrace(3)]]**, **[[basename(3)]]**, **[[bcopy(3)]]**, **[[bindresvport(3)]]**, **[[bsd_signal(3)]]**, **[[bsearch(3)]]**, **[[btowc(3)]]**, **[[byteorder(3)]]**, **[[bzero(3)]]**, **[[cabs(3)]]**, **[[cacos(3)]]**, **[[cacosh(3)]]**, **[[canonicalize_file_name(3)]]**, **[[carg(3)]]**, **[[casin(3)]]**, **[[casinh(3)]]**, **[[catan(3)]]**, **[[catanh(3)]]**, **[[catgets(3)]]**, **[[catopen(3)]]**, **[[cbrt(3)]]**, **[[ccos(3)]]**, **[[ceil(3)]]**, **[[cexp(3)]]**, **[[cfree(3)]]**, **[[cimag(3)]]**, **[[clearenv(3)]]**, **[[clock(3)]]**, **[[clock_getcpuclockid(3)]]**, **[[clog10(3)]]**, **[[clog(3)]]**, **[[closedir(3)]]**, **[[confstr(3)]]**, **[[conj(3)]]**, **[[copysign(3)]]**, **[[cos(3)]]**, **[[cosh(3)]]**, **[[cpow(3)]]**, **[[cproj(3)]]**, **[[creal(3)]]**, **[[crypt(3)]]**, **[[csin(3)]]**, **[[csinh(3)]]**, **[[csqrt(3)]]**, **[[ctan(3)]]**, **[[ctanh(3)]]**, **[[ctermid(3)]]**, **[[ctime(3)]]**, **[[daemon(3)]]**, **[[des_crypt(3)]]**, **[[difftime(3)]]**, **[[dirfd(3)]]**, **[[div(3)]]**, **[[dladdr(3)]]**, **[[dlerror(3)]]**, **[[dlinfo(3)]]**, **[[dl_iterate_phdr(3)]]**, **[[dlopen(3)]]**, **[[dlsym(3)]]**, **[[drand48(3)]]**, **[[drand48_r(3)]]**, **[[dysize(3)]]**, **[[ecvt(3)]]**, **[[ecvt_r(3)]]**, **[[encrypt(3)]]**, **[[envz_add(3)]]**, **[[erf(3)]]**, **[[erfc(3)]]**, **[[err(3)]]**, **[[error(3)]]**, **[[ether_aton(3)]]**, **[[euidaccess(3)]]**, **[[exec(3)]]**, **[[exit(3)]]**, **[[exp10(3)]]**, **[[exp2(3)]]**, **[[exp(3)]]**, **[[expm1(3)]]**, **[[fabs(3)]]**, **[[fclose(3)]]**, **[[fcloseall(3)]]**, **[[fdim(3)]]**, **[[fenv(3)]]**, **[[ferror(3)]]**, **[[fexecve(3)]]**, **[[fflush(3)]]**, **[[ffs(3)]]**, **[[fgetc(3)]]**, **[[fgetgrent(3)]]**, **[[fgetpwent(3)]]**, **[[fgetwc(3)]]**, **[[fgetws(3)]]**, **[[fileno(3)]]**, **[[finite(3)]]**, **[[flockfile(3)]]**, **[[floor(3)]]**, **[[fma(3)]]**, **[[fmax(3)]]**, **[[fmemopen(3)]]**, **[[fmin(3)]]**, **[[fmod(3)]]**, **[[fmtmsg(3)]]**, **[[fnmatch(3)]]**, **[[fopen(3)]]**, **[[fopencookie(3)]]**, **[[fpathconf(3)]]**, **[[fpclassify(3)]]**, **[[fpurge(3)]]**, **[[fputwc(3)]]**, **[[fputws(3)]]**, **[[fread(3)]]**, **[[frexp(3)]]**, **[[fseek(3)]]**, **[[fseeko(3)]]**, **[[ftime(3)]]**, **[[ftok(3)]]**, **[[fts(3)]]**, **[[ftw(3)]]**, **[[futimes(3)]]**, **[[gamma(3)]]**, **[[gcvt(3)]]**, **[[getaddrinfo(3)]]**, **[[getaddrinfo_a(3)]]**, **[[getauxval(3)]]**, **[[getcontext(3)]]**, **[[getcwd(3)]]**, **[[getdate(3)]]**, **[[getdirentries(3)]]**, **[[getdtablesize(3)]]**, **[[getenv(3)]]**, **[[getfsent(3)]]**, **[[getgrent(3)]]**, **[[getgrent_r(3)]]**, **[[getgrnam(3)]]**, **[[getgrouplist(3)]]**, **[[gethostbyname(3)]]**, **[[gethostid(3)]]**, **[[getifaddrs(3)]]**, **[[getline(3)]]**, **[[getloadavg(3)]]**, **[[getlogin(3)]]**, **[[getmntent(3)]]**, **[[getnameinfo(3)]]**, **[[getnetent(3)]]**, **[[getnetent_r(3)]]**, **[[get_nprocs(3)]]**, **[[getopt(3)]]**, **[[getpass(3)]]**, **[[getprotoent(3)]]**, **[[getprotoent_r(3)]]**, **[[getpt(3)]]**, **[[getpw(3)]]**, **[[getpwent(3)]]**, **[[getpwent_r(3)]]**, **[[getpwnam(3)]]**, **[[getrpcent(3)]]**, **[[getrpcent_r(3)]]**, **[[getrpcport(3)]]**, **[[gets(3)]]**, **[[getservent(3)]]**, **[[getservent_r(3)]]**, **[[getspnam(3)]]**, **[[getsubopt(3)]]**, **[[getttyent(3)]]**, **[[getusershell(3)]]**, **[[getutent(3)]]**, **[[getutmp(3)]]**, **[[getw(3)]]**, **[[getwchar(3)]]**, **[[glob(3)]]**, **[[gnu_get_libc_version(3)]]**, **[[grantpt(3)]]**, **[[gsignal(3)]]**, **[[hsearch(3)]]**, **[[hypot(3)]]**, **[[iconv(3)]]**, **[[iconv_close(3)]]**, **[[iconv_open(3)]]**, **[[if_nameindex(3)]]**, **[[if_nametoindex(3)]]**, **[[ilogb(3)]]**,
Observera: Texten i denna man-sida är baserad på material hämtat från avsnittet "POSIX Safety Concepts" i GNU C Library-manualen. Ytterligare detaljer om de ämnen som beskrivs här kan hittas i den manualen.


**[[inet(3)]]**, **[[inet_ntop(3)]]**, **[[inet_pton(3)]]**, **[[initgroups(3)]]**, **[[insque(3)]]**, **[[isalpha(3)]]**, **[[isatty(3)]]**, **[[isgreater(3)]]**, **[[iswalnum(3)]]**, **[[iswalpha(3)]]**, **[[iswblank(3)]]**, **[[iswcntrl(3)]]**, **[[iswctype(3)]]**, **[[iswdigit(3)]]**, **[[iswgraph(3)]]**, **[[iswlower(3)]]**, **[[iswprint(3)]]**, **[[iswpunct(3)]]**, **[[iswspace(3)]]**, **[[iswupper(3)]]**, **[[iswxdigit(3)]]**, **[[j0(3)]]**, **[[key_setsecret(3)]]**, **[[ldexp(3)]]**, **[[lio_listio(3)]]**, **[[localeconv(3)]]**, **[[lockf(3)]]**, **[[log10(3)]]**, **[[log1p(3)]]**, **[[log2(3)]]**, **[[log(3)]]**, **[[logb(3)]]**, **[[login(3)]]**, **[[lrint(3)]]**, **[[lround(3)]]**, **[[lsearch(3)]]**, **[[lseek64(3)]]**, **[[makecontext(3)]]**, **[[makedev(3)]]**, **[[mallinfo(3)]]**, **[[malloc(3)]]**, **[[malloc_get_state(3)]]**, **[[malloc_info(3)]]**, **[[malloc_stats(3)]]**, **[[malloc_trim(3)]]**, **[[malloc_usable_size(3)]]**, **[[matherr(3)]]**, **[[mblen(3)]]**, **[[mbrlen(3)]]**, **[[mbrtowc(3)]]**, **[[mbsinit(3)]]**, **[[mbsnrtowcs(3)]]**, **[[mbsrtowcs(3)]]**, **[[mbstowcs(3)]]**, **[[mbtowc(3)]]**, **[[mcheck(3)]]**, **[[memccpy(3)]]**, **[[memchr(3)]]**, **[[memcmp(3)]]**, **[[memcpy(3)]]**, **[[memfrob(3)]]**, **[[memmem(3)]]**, **[[memmove(3)]]**, **[[mempcpy(3)]]**, **[[memset(3)]]**, **[[mkdtemp(3)]]**, **[[mkfifo(3)]]**, **[[mkstemp(3)]]**, **[[mktemp(3)]]**, **[[modf(3)]]**, **[[mq_close(3)]]**, **[[mq_getattr(3)]]**, **[[mq_notify(3)]]**, **[[mq_open(3)]]**, **[[mq_receive(3)]]**, **[[mq_send(3)]]**, **[[mq_unlink(3)]]**, **[[mtrace(3)]]**, **[[nan(3)]]**, **[[nextafter(3)]]**, **[[nextup(3)]]**, **[[nl_langinfo(3)]]**, **[[ntp_gettime(3)]]**, **[[on_exit(3)]]**, **[[opendir(3)]]**, **[[open_memstream(3)]]**, **[[openpty(3)]]**, **[[perror(3)]]**, **[[popen(3)]]**, **[[posix_fallocate(3)]]**, **[[posix_memalign(3)]]**, **[[posix_openpt(3)]]**, **[[pow10(3)]]**, **[[pow(3)]]**, **[[__ppc_set_ppr_med(3)]]**, **[[__ppc_yield(3)]]**, **[[printf(3)]]**, **[[profil(3)]]**, **[[psignal(3)]]**, **[[pthread_attr_init(3)]]**, **[[pthread_attr_setaffinity_np(3)]]**, **[[pthread_attr_setdetachstate(3)]]**, **[[pthread_attr_setguardsize(3)]]**, **[[pthread_attr_setinheritsched(3)]]**, **[[pthread_attr_setschedparam(3)]]**, **[[pthread_attr_setschedpolicy(3)]]**, **[[pthread_attr_setscope(3)]]**, **[[pthread_attr_setsigmask_np(3)]]**, **[[pthread_attr_setstack(3)]]**, **[[pthread_attr_setstackaddr(3)]]**, **[[pthread_attr_setstacksize(3)]]**, **[[pthread_cancel(3)]]**, **[[pthread_cleanup_push(3)]]**, **[[pthread_create(3)]]**, **[[pthread_detach(3)]]**, **[[pthread_equal(3)]]**, **[[pthread_exit(3)]]**, **[[pthread_getattr_default_np(3)]]**, **[[pthread_getattr_np(3)]]**, **[[pthread_getcpuclockid(3)]]**, **[[pthread_join(3)]]**, **[[pthread_kill(3)]]**, **[[pthread_kill_other_threads_np(3)]]**, **[[pthread_self(3)]]**, **[[pthread_setaffinity_np(3)]]**, **[[pthread_setcancelstate(3)]]**, **[[pthread_setconcurrency(3)]]**, **[[pthread_setname_np(3)]]**, **[[pthread_setschedparam(3)]]**, **[[pthread_setschedprio(3)]]**, **[[pthread_sigmask(3)]]**, **[[pthread_sigqueue(3)]]**, **[[pthread_testcancel(3)]]**, **[[pthread_tryjoin_np(3)]]**, **[[pthread_yield(3)]]**, **[[ptsname(3)]]**, **[[putenv(3)]]**, **[[putgrent(3)]]**, **[[putpwent(3)]]**, **[[puts(3)]]**, **[[putwchar(3)]]**, **[[qecvt(3)]]**, **[[qsort(3)]]**, **[[raise(3)]]**, **[[rand(3)]]**, **[[random(3)]]**, **[[random_r(3)]]**, **[[rcmd(3)]]**, **[[readdir(3)]]**, **[[readdir_r(3)]]**, **[[realpath(3)]]**, **[[re_comp(3)]]**, **[[regex(3)]]**, **[[remainder(3)]]**, **[[remove(3)]]**, **[[remquo(3)]]**, **[[resolver(3)]]**, **[[rewinddir(3)]]**, **[[rexec(3)]]**, **[[rint(3)]]**, **[[round(3)]]**, **[[rpc(3)]]**, **[[rpmatch(3)]]**, **[[rtime(3)]]**, **[[scalb(3)]]**, **[[scalbln(3)]]**, **[[scandir(3)]]**, **[[scanf(3)]]**, **[[sched_getcpu(3)]]**, **[[seekdir(3)]]**, **[[sem_close(3)]]**, **[[sem_destroy(3)]]**, **[[sem_getvalue(3)]]**, **[[sem_init(3)]]**, **[[sem_open(3)]]**, **[[sem_post(3)]]**, **[[sem_unlink(3)]]**, **[[sem_wait(3)]]**, **[[setaliasent(3)]]**, **[[setbuf(3)]]**, **[[setenv(3)]]**, **[[setjmp(3)]]**, **[[setlocale(3)]]**, **[[setlogmask(3)]]**, **[[setnetgrent(3)]]**, **[[shm_open(3)]]**, **[[siginterrupt(3)]]**, **[[signbit(3)]]**, **[[significand(3)]]**, **[[sigpause(3)]]**, **[[sigqueue(3)]]**, **[[sigset(3)]]**, **[[sigsetops(3)]]**, **[[sigvec(3)]]**, **[[sigwait(3)]]**, **[[sin(3)]]**, **[[sincos(3)]]**, **[[sinh(3)]]**, **[[sleep(3)]]**, **[[sockatmark(3)]]**, **[[sqrt(3)]]**, **[[sscanf(3)]]**, **[[statvfs(3)]]**, **[[stdarg(3)]]**, **[[stdio_ext(3)]]**, **[[stpncpy(3)]]**, **[[strcasecmp(3)]]**, **[[strchr(3)]]**, **[[strcmp(3)]]**, **[[strcoll(3)]]**, **[[strcpy(3)]]**, **[[strdup(3)]]**, **[[strerror(3)]]**, **
Olika funktionsmanualsidor inkluderar en sektion '''ATTRIBUTES''' som beskriver säkerheten vid anrop av funktionen i olika sammanhang. Denna sektion annoterar funktioner med följande säkerhetsmarkeringar:


[[strfmon(3)]]**, **[[strfromd(3)]]**, **[[strfry(3)]]**, **[[strftime(3)]]**, **[[strlen(3)]]**, **[[strncat(3)]]**, **[[strnlen(3)]]**, **[[strpbrk(3)]]**, **[[strptime(3)]]**, **[[strsep(3)]]**, **[[strsignal(3)]]**, **[[strspn(3)]]**, **[[strstr(3)]]**, **[[strtod(3)]]**, **[[strtoimax(3)]]**, **[[strtok(3)]]**, **[[strtol(3)]]**, **[[strtoul(3)]]**, **[[strverscmp(3)]]**, **[[strxfrm(3)]]**, **[[swab(3)]]**, **[[sysconf(3)]]**, **[[syslog(3)]]**, **[[system(3)]]**, **[[sysv_signal(3)]]**, **[[tan(3)]]**, **[[tanh(3)]]**, **[[tcgetpgrp(3)]]**, **[[tcgetsid(3)]]**, **[[telldir(3)]]**, **[[tempnam(3)]]**, **[[termios(3)]]**, **[[tgamma(3)]]**, **[[timegm(3)]]**, **[[tmpfile(3)]]**, **[[tmpnam(3)]]**, **[[toascii(3)]]**, **[[toupper(3)]]**, **[[towctrans(3)]]**, **[[towlower(3)]]**, **[[towupper(3)]]**, **[[trunc(3)]]**, **[[tsearch(3)]]**, **[[ttyname(3)]]**, **[[ttyslot(3)]]**, **[[tzset(3)]]**, **[[ualarm(3)]]**, **[[ulimit(3)]]**, **[[ungetwc(3)]]**, **[[unlocked_stdio(3)]]**, **[[unlockpt(3)]]**, **[[updwtmp(3)]]**, **[[usleep(3)]]**, **[[wcpcpy(3)]]**, **[[wcpncpy(3)]]**, **[[wcrtomb(3)]]**, **[[wcscasecmp(3)]]**, **[[wcscat(3)]]**, **[[wcschr(3)]]**, **[[wcscmp(3)]]**, **[[wcscpy(3)]]**, **[[wcscspn(3)]]**, **[[wcsdup(3)]]**, **[[wcslen(3)]]**, **[[wcsncasecmp(3)]]**, **[[wcsncat(3)]]**, **[[wcsncmp(3)]]**, **[[wcsncpy(3)]]**, **[[wcsnlen(3)]]**, **[[wcsnrtombs(3)]]**, **[[wcspbrk(3)]]**, **[[wcsrchr(3)]]**, **[[wcsrtombs(3)]]**, **[[wcsspn(3)]]**, **[[wcsstr(3)]]**, **[[wcstoimax(3)]]**, **[[wcstok(3)]]**, **[[wcstombs(3)]]**, **[[wcswidth(3)]]**, **[[wctob(3)]]**, **[[wctomb(3)]]**, **[[wctrans(3)]]**, **[[wctype(3)]]**, **[[wcwidth(3)]]**, **[[wmemchr(3)]]**, **[[wmemcmp(3)]]**, **[[wmemcpy(3)]]**, **[[wmemmove(3)]]**, **[[wmemset(3)]]**, **[[wordexp(3)]]**, **[[wprintf(3)]]**, **[[xcrypt(3)]]**, **[[xdr(3)]]**, **[[y0(3)]]**, **[[man-pages(7)]]**, **[[pthreads(7)]]**, **[[standards(7)]]**
=== MT-Safe ===
'''MT-Safe''' eller trådsäkra funktioner är säkra att anropa i närvaro av andra trådar. '''MT''' i '''MT-Safe''' står för Multi Thread.
 
Att vara '''MT-Safe''' innebär dock inte att en funktion är atomär, eller att den använder någon av de minnessynkroniseringsmekanismer som POSIX exponerar för användare. Det är till och med möjligt att anrop av '''MT-Safe'''-funktioner i följd inte ger en '''MT-Safe''' kombination. Till exempel garanterar inte att en tråd anropar två '''MT-Safe'''-funktioner direkt efter varandra ett beteende som motsvarar atomär exekvering av kombinationen av båda funktionerna, eftersom samtidiga anrop i andra trådar kan störa på ett destruktivt sätt.
 
Helprogramoptimeringar som kan inlinera funktioner över biblioteksgränssnitt kan exponera osäker omordning, och därför rekommenderas inte inlining över GNU C Library-gränssnittet. Den dokumenterade '''MT-Safety'''-statusen garanteras inte under helprogramoptimering. Dock är funktioner definierade i användar-synliga headers designade att vara säkra för inlining.
 
=== MT-Unsafe ===
'''MT-Unsafe'''-funktioner är inte säkra att anropa i multitrådade program.
 
Andra nyckelord som förekommer i säkerhetsanmärkningar definieras i följande sektioner.
 
=== Villkorligt säkra funktioner ===
För vissa funktioner som gör funktioner osäkra att anropa i vissa sammanhang finns det kända sätt att undvika säkerhetsproblemet annat än att helt avstå från att anropa funktionen. De följande nyckelorden refererar till sådana funktioner, och var och en av deras definitioner indikerar hur hela programmet behöver begränsas för att eliminera säkerhetsproblemet som indikeras av nyckelordet. Endast när alla skäl som gör en funktion osäker är observerade och åtgärdade, genom att tillämpa de dokumenterade begränsningarna, blir funktionen säker att anropa i ett sammanhang.
 
==== init ====
Funktioner märkta med '''init''' som en '''MT-Unsafe'''-egenskap utför osäker initialisering när de anropas första gången.
 
Att anropa en sådan funktion minst en gång i enkeltrådigt läge tar bort denna specifika orsak för att funktionen ska betraktas som '''MT-Unsafe'''. Om ingen annan orsak kvarstår kan funktionen därefter säkert anropas efter att andra trådar har startats.
 
==== race ====
Funktioner annoterade med '''race''' som ett '''MT-Safety'''-problem opererar på objekt på sätt som kan orsaka data-kapplöpningar eller liknande former av destruktiv interferens vid samtidig exekvering. I vissa fall skickas objekten till funktionerna av användare; i andra används de av funktionerna för att returnera värden till användare; i ytterligare andra exponeras de inte ens för användare.
 
==== const ====
Funktioner märkta med '''const''' som ett '''MT-Safety'''-problem modifierar icke-atomärt interna objekt som bättre betraktas som konstanta, eftersom en stor del av GNU C Library får åtkomst till dem utan synkronisering. Till skillnad från '''race''', som gör både läsare och skribenter av interna objekt osäkra, tillämpas denna markering endast på skribenter. Skribenter förblir '''MT-Unsafe''' att anropa, men objektens då obligatoriska konstanthet som de modifierar möjliggör att läsare betraktas som '''MT-Safe''' (så länge inga andra skäl för osäkerhet kvarstår), eftersom avsaknaden av synkronisering inte är ett problem när objekten är i praktiken konstanta.
 
Identifikatorn som följer efter '''const''' kommer att visas ensam som en säkerhetsanmärkning i läsare. Program som vill arbeta runt detta säkerhetsproblem, för att kunna anropa skribenter, kan använda ett icke-rekursivt läs-skriv-lås associerat med identifikatorn, och skydda alla anrop till funktioner märkta med '''const''' följt av identifikatorn med ett skrivlås, och alla anrop till funktioner märkta med identifikatorn ensam med ett läslås.
 
==== sig ====
Funktioner märkta med '''sig''' som ett '''MT-Safety'''-problem kan temporärt installera en signalhanterare för interna ändamål, vilket kan störa andra användningar av signalen, identifierad efter ett kolon.
 
Detta säkerhetsproblem kan undvikas genom att säkerställa att inga andra användningar av signalen kommer att äga rum under samtalet. Att hålla ett icke-rekursivt mutexlås medan man anropar alla funktioner som använder samma temporära signal; att blockera den signalen före anropet och återställa dess hanterare efteråt rekommenderas.
 
==== term ====
Funktioner märkta med '''term''' som ett '''MT-Safety'''-problem kan ändra terminalinställningarna på det rekommenderade sättet, nämligen: anropa <code>tcgetattr(3)</code>, modifiera vissa flaggor, och sedan anropa <code>tcsetattr(3)</code>. Detta skapar ett fönster där ändringar gjorda av andra trådar går förlorade. Således är funktioner märkta med '''term''' '''MT-Unsafe'''.
 
Det är därför tillrådligt för applikationer som använder terminalen att undvika samtidiga och reentranta interaktioner med den, genom att inte använda den i signalhanterare eller blockera signaler som kan använda den, och hålla ett lås medan man anropar dessa funktioner och interagerar med terminalen. Detta lås bör också användas för ömsesidig uteslutning med funktioner märkta med '''race:tcattr(fd)''', där '''fd''' är en filbeskrivare för den styrande terminalen. Anroparen kan använda en enda mutex för enkelhetens skull, eller använda en mutex per terminal, även om de refereras till av olika filbeskrivare.
 
=== Andra säkerhetsanmärkningar ===
Ytterligare nyckelord kan bifogas funktioner, vilket indikerar funktioner som inte gör en funktion osäker att anropa, men som kan behöva beaktas i vissa programklasser:
 
==== locale ====
Funktioner annoterade med '''locale''' som ett '''MT-Safety'''-problem läser från lokalobjektet utan någon form av synkronisering. Funktioner annoterade med '''locale''' som anropas samtidigt med lokala ändringar kan bete sig på sätt som inte motsvarar någon av de lokaler som är aktiva under deras exekvering, utan en oförutsägbar blandning av dem.
 
Vi markerar inte dessa funktioner som '''MT-Unsafe''', eftersom funktioner som modifierar lokalobjektet är märkta med '''const:locale''' och betraktas som osäkra. Eftersom de är osäkra ska de senare inte anropas när flera trådar körs eller asynkrona signaler är aktiverade, och därför kan lokalen betraktas som i praktiken konstant i dessa sammanhang, vilket gör de tidigare säkra.
 
==== env ====
Funktioner märkta med '''env''' som ett '''MT-Safety'''-problem får åtkomst till miljön med <code>getenv(3)</code> eller liknande, utan några skydd för att säkerställa säkerhet i närvaro av samtidiga modifieringar.
 
Vi markerar inte dessa funktioner som '''MT-Unsafe''', eftersom funktioner som modifierar miljön alla är märkta med '''const:env''' och betraktas som osäkra. Eftersom de är osäkra ska de senare inte anropas när flera trådar körs eller asynkrona signaler är aktiverade, och därför kan miljön betraktas som i praktiken konstant i dessa sammanhang, vilket gör de tidigare säkra.
 
==== hostid ====
Funktionen märkt med '''hostid''' som ett '''MT-Safety'''-problem läser från systemövergripande datastrukturer som håller maskinens "host ID". Dessa datastrukturer kan generellt inte modifieras atomärt. Eftersom det förväntas att "host ID" normalt inte kommer att ändras, betraktas funktionen som läser från den (<code>gethostid(3)</code>) som säker, medan funktionen som modifierar den (<code>sethostid(3)</code>) är märkt med '''const:hostid''', vilket indikerar att den kan kräva särskild omsorg om den ska anropas. I detta specifika fall motsvarar den särskilda omsorgen systemövergripande (inte bara inom process) koordination.
 
==== sigintr ====
Funktioner märkta med '''sigintr''' som ett '''MT-Safety'''-problem får åtkomst till GNU C Librarys interna datastruktur '''_sigintr''' utan några skydd för att säkerställa säkerhet i närvaro av samtidiga modifieringar.
 
Vi markerar inte dessa funktioner som '''MT-Unsafe''', eftersom funktioner som modifierar denna datastruktur alla är märkta med '''const:sigintr''' och betraktas som osäkra. Eftersom de är osäkra ska de senare inte anropas när flera trådar körs eller asynkrona signaler är aktiverade, och därför kan datastrukturen betraktas som i praktiken konstant i dessa sammanhang, vilket gör de tidigare säkra.
 
==== cwd ====
Funktioner märkta med '''cwd''' som ett '''MT-Safety'''-problem kan temporärt ändra den aktuella arbetskatalogen under sin exekvering, vilket kan orsaka att relativa sökvägar löses på oväntade sätt i andra trådar eller inom asynkrona signal- eller avbrythanterare.
 
Detta är inte tillräckligt för att markera så märkta funktioner som '''MT-Unsafe''', men när detta beteende är valfritt (t.ex. <code>nftw(3)</code> med '''FTW_CHDIR'''), kan det vara ett bra alternativ att undvika alternativet istället för att använda fullständiga sökvägar eller filbeskrivare-relativa (t.ex. <code>openat(2)</code>) systemanrop.
 
==== :identifier ====
Annoteringar kan ibland följas av identifikatorer, avsedda att gruppera flera funktioner som, till exempel, får åtkomst till datastrukturer på ett osäkert sätt, som i '''race''' och '''const''', eller för att ge mer specifik information, såsom att namnge en signal i en funktion märkt med '''sig'''. Det förutses att det kan tillämpas på '''lock''' och '''corrupt''' också i framtiden.
 
I de flesta fall kommer identifikatorn att namnge en uppsättning funktioner, men den kan namnge globala objekt eller funktionsargument, eller identifierbara egenskaper eller logiska komponenter associerade med dem, med en notation som, till exempel, ''':buf(arg)''' för att beteckna en buffer associerad med argumentet '''arg''', eller ''':tcattr(fd)''' för att beteckna terminalattributen för en filbeskrivare '''fd'''.
 
Den vanligaste användningen för identifikatorer är att tillhandahålla logiska grupper av funktioner och argument som behöver skyddas av samma synkroniseringsprimitive för att säkerställa säker drift i ett givet sammanhang.
 
==== /villkor ====
Vissa säkerhetsannoteringar kan vara villkorliga, i den meningen att de endast gäller om ett booleskt uttryck som involverar argument, globala variabler eller till och med den underliggande kärnan utvärderas till sant. Till exempel, '''/!ps''' och '''/one_per_line''' indikerar att den föregående markören endast gäller när argumentet '''ps''' är '''NULL''', eller den globala variabeln '''one_per_line''' är nollskild.
 
När alla markeringar som gör en funktion osäker är prydda med sådana villkor, och inget av de nämnda villkoren gäller, kan funktionen betraktas som säker.
 
== SE ÄVEN ==
* [[pthreads(7)]]
* [[signal-safety(7)]]
 
== COLOFON ==
Denna sida är en del av man-sidorna (dokumentation för Linux-kärnan och C-bibliotekets användargränssnitt) projekt. Information om projektet finns på [https://www.kernel.org/doc/man-pages/ man-pages-projektet]. 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 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 du tror att det finns en bättre eller mer uppdaterad källa för sidan, eller 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   '''attributes(7)'''
 
== Sidor som hänvisar till denna sida ==
''adjtimex(2)'', ''clock_getres(2)'', ''eventfd(2)'', ''getrlimit(2)'', ''getrusage(2)'', ''mmap(2)'',  ''sigaltstack(2)'',  ''utimensat(2)'',  ''a64l(3)'', ''abort(3)'', ''abs(3)'',  ''acos(3)'', ''acosh(3)'', ''addseverity(3)'', ''adjtime(3)'', ''aio_cancel(3)'', ''aio_error(3)'', ''aio_fsync(3)'',  ''aio_read(3)'', ''aio_return(3)'', ''aio_suspend(3)'', ''aio_write(3)'', ''alloca(3)'', ''arc4random(3)'', ''argz_add(3)'',  ''asin(3)'', ''asinh(3)'', ''asprintf(3)'', ''assert(3)'', ''assert_perror(3)'', ''atan2(3)'', ''atan(3)'',  ''atanh(3)'', ''atexit(3)'', ''atof(3)'', ''atoi(3)'', ''backtrace(3)'', ''basename(3)'', ''bcopy(3)'',  ''bindresvport(3)'', ''bsd_signal(3)'', ''bsearch(3)'', ''btowc(3)'', ''byteorder(3)'', ''bzero(3)'', ''cabs(3)'',  ''cacos(3)'', ''cacosh(3)'', ''canonicalize_file_name(3)'', ''carg(3)'', ''casin(3)'', ''casinh(3)'', ''catan(3)'',  ''catanh(3)'', ''catgets(3)'', ''catopen(3)'', ''cbrt(3)'', ''ccos(3)'', ''ceil(3)'', ''cexp(3)'',  ''cfree(3)'', ''cimag(3)'', ''clearenv(3)'', ''clock(3)'', ''clock_getcpuclockid(3)'', ''clog10(3)'', ''clog(3)'',  ''closedir(3)'', ''confstr(3)'', ''conj(3)'', ''copysign(3)'', ''cos(3)'', ''cosh(3)'', ''cpow(3)'',  ''cproj(3)'', ''creal(3)'', ''crypt(3)'', ''csin(3)'', ''csinh(3)'', ''csqrt(3)'', ''ctan(3)'',  ''ctanh(3)'', ''ctermid(3)'', ''ctime(3)'', ''daemon(3)'',  ''des_crypt(3)'',  ''difftime(3)'',  ''dirfd(3)'',  ''div(3)'',  ''dladdr(3)'', ''dlerror(3)'',  ''dlinfo(3)'',  ''dl_iterate_phdr(3)'',  ''dlopen(3)'',  ''dlsym(3)'',  ''drand48(3)'',  ''drand48_r(3)'',  ''dysize(3)'',  ''ecvt(3)'',  ''ecvt_r(3)'',  ''encrypt(3)'',  ''envz_add(3)'',  ''erf(3)'',  ''erfc(3)'',  ''err(3)'',  ''error(3)'',  ''ether_aton(3)'',  ''euidaccess(3)'',  ''exec(3)'',  ''exit(3)'',  ''exp10(3)'',  ''exp2(3)'',  ''exp(3)'',  ''expm1(3)'',  ''fabs(3)'',  ''fclose(3)'',  ''fcloseall(3)'',  ''fdim(3)'',  ''fenv(3)'',  ''ferror(3)'',  ''fexecve(3)'',  ''fflush(3)'',  ''ffs(3)'',  ''fgetc(3)'',  ''fgetgrent(3)'',  ''fgetpwent(3)'',  ''fgetwc(3)'',  ''fgetws(3)'',  ''fileno(3)'',  ''finite(3)'',  ''flockfile(3)'',  ''floor(3)'',  ''fma(3)'',  ''fmax(3)'',  ''fmemopen(3)'',  ''fmin(3)'',  ''fmod(3)'',  ''fmtmsg(3)'',  ''fnmatch(3)'',  ''fopen(3)'',  ''fopencookie(3)'',  ''fpathconf(3)'',  ''fpclassify(3)'',  ''fpurge(3)'',  ''fputwc(3)'',  ''fputws(3)'',  ''fread(3)'',  ''frexp(3)'',  ''fseek(3)'',  ''fseeko(3)'',  ''ftime(3)'',  ''ftok(3)'',  ''fts(3)'',  ''ftw(3)'',  ''futimes(3)'',  ''gamma(3)'',  ''gcvt(3)'',  ''getaddrinfo(3)'',  ''getaddrinfo_a(3)'',  ''getauxval(3)'',  ''getcontext(3)'',  ''getcwd(3)'',  ''getdate(3)'',  ''getdirentries(3)'',  ''getdtablesize(3)'',  ''getenv(3)'',  ''getfsent(3)'',  ''getgrent(3)'',  ''getgrent_r(3)'',  ''getgrnam(3)'',  ''getgrouplist(3)'',  ''gethostbyname(3)'',  ''gethostid(3)'',  ''getifaddrs(3)'',  ''getline(3)'',  ''getloadavg(3)'',  ''getlogin(3)'',  ''getmntent(3)'',  ''getnameinfo(3)'',  ''getnetent(3)'',  ''getnetent_r(3)'',  ''get_nprocs(3)'',  ''getopt(3)'',  ''getpass(3)'',  ''getprotoent(3)'',  ''getprotoent_r(3)'',  ''getpt(3)'',  ''getpw(3)'',  ''getpwent(3)'',  ''getpwent_r(3)'',  ''getpwnam(3)'',  ''getrpcent(3)'',  ''getrpcent_r(3)'',  ''getrpcport(3)'',  ''gets(3)'',  ''getservent(3)'',  ''getservent_r(3)'',  ''getspnam(3)'',  ''getsubopt(3)'',  ''getttyent(3)'',  ''getusershell(3)'',  ''getutent(3)'',  ''getutmp(3)'',  ''getw(3)'',  ''getwchar(3)'',  ''glob(3)'',  ''gnu_get_libc_version(3)'',  ''grantpt(3)'',  ''gsignal(3)'',  ''hsearch(3)'',  ''hypot(3)'',  ''iconv(3)'',  ''iconv_close(3)'',  ''iconv_open(3)'',  ''if_nameindex(3)'',  ''if_nametoindex(3)'',  ''ilogb(3)'',  ''inet(3)'',  ''inet_ntop(3)'',  ''inet_pton(3)'',  ''initgroups(3)'',  ''insque(3)'',  ''isalpha(3)'',  ''isatty(3)'',  ''isgreater(3)'',  ''iswalnum(3)'',  ''iswalpha(3)'',  ''iswblank(3)'',  ''iswcntrl(3)'',  ''iswctype(3)'',  ''iswdigit(3)'',  ''iswgraph(3)'',  ''iswlower(3)'',  ''iswprint(3)'',  ''iswpunct(3)'',  ''iswspace(3)'',  ''iswupper(3)'',  ''iswxdigit(3)'',  ''j0(3)'',  ''key_setsecret(3)'',  ''ldexp(3)'',  ''lio_listio(3)'',  ''localeconv(3)'',  ''lockf(3)'',  ''log10(3)'',  ''log1p(3)'',  ''log2(3)'',  ''log(3)'',  ''logb(3)'',  ''login(3)'',  ''lrint(3)'',  ''lround(3)'',  ''lsearch(3)'',  ''lseek64(3)'',  ''makecontext(3)'',  ''makedev(3)'',  ''mallinfo(3)'',  ''malloc(3)'',  ''malloc_get_state(3)'',  ''malloc_info(3)'',  ''malloc_stats(3)'',  ''malloc_trim(3)'',  ''malloc_usable_size(3)'',  ''matherr(3)'',  ''mblen(3)'',  ''mbrlen(3)'',  ''mbrtowc(3)'',  ''mbsinit(3)'',  ''mbsnrtowcs(3)'',  ''mbsrtowcs(3)'',  ''mbstowcs(3)'',  ''mbtowc(3)'',  ''mcheck(3)'',  ''memccpy(3)'',  ''memchr(3)'',  ''memcmp(3)'',  ''memcpy(3)'',  ''memfrob(3)'',  ''memmem(3)'',  ''memmove(3)'',  ''mempcpy(3)'',  ''memset(3)'',  ''mkdtemp(3)'',  ''mkfifo(3)'',  ''mkstemp(3)'',  ''mktemp(3)'',  ''modf(3)'',  ''mq_close(3)'',  ''mq_getattr(3)'',  ''mq_notify(3)'',  ''mq_open(3)'',  ''mq_receive(3)'',  ''mq_send(3)'',  ''mq_unlink(3)'',  ''mtrace(3)'',  ''nan(3)'',  ''nextafter(3)'',  ''nextup(3)'',  ''nl_langinfo(3)'',  ''ntp_gettime(3)'',  ''on_exit(3)'',  ''opendir(3)'',  ''open_memstream(3)'',  ''openpty(3)'',  ''perror(3)'',  ''popen(3)'',  ''posix_fallocate(3)'',  ''posix_memalign(3)'',  ''posix_openpt(3)'',  ''pow10(3)'',  ''pow(3)'',  ''__ppc_set_ppr_med(3)'',  ''__ppc_yield(3)'',  ''printf(3)'',  ''profil(3)'',  ''psignal(3)'',  ''pthread_attr_init(3)'',  ''pthread_attr_setaffinity_np(3)'',  ''pthread_attr_setdetachstate(3)'',  ''pthread_attr_setguardsize(3)'',  ''pthread_attr_setinheritsched(3)'',  ''pthread_attr_setschedparam(3)'',  ''pthread_attr_setschedpolicy(3)'',  ''pthread_attr_setscope(3)'',  ''pthread_attr_setsigmask_np(3)'',  ''pthread_attr_setstack(3)'',  ''pthread_attr_setstackaddr(3)'',  ''pthread_attr_setstacksize(3)'',  ''pthread_cancel(3)'',  ''pthread_cleanup_push(3)'',  ''pthread_create(3)'',  ''pthread_detach(3)'',  ''pthread_equal(3)'',  ''pthread_exit(3)'',  ''pthread_getattr_default_np(3)'',  ''pthread_getattr_np(3)'',  ''pthread_getcpuclockid(3)'',  ''pthread_join(3)'',  ''pthread_kill(3)'',  ''pthread_kill_other_threads_np(3)'',  ''pthread_self(3)'',  ''pthread_setaffinity_np(3)'',  ''pthread_setcancelstate(3)'',  ''pthread_setconcurrency(3)'',  ''pthread_setname_np(3)'',  ''pthread_setschedparam(3)'',  ''pthread_setschedprio(3)'',  ''pthread_sigmask(3)'',  ''pthread_sigqueue(3)'',  ''pthread_testcancel(3)'',  ''pthread_tryjoin_np(3)'',  ''pthread_yield(3)'',  ''ptsname(3)'',  ''putenv(3)'',  ''putgrent(3)'',  ''putpwent(3)'',  ''puts(3)'',  ''putwchar(3)'',  ''qecvt(3)'',  ''qsort(3)'',  ''raise(3)'',  ''rand(3)'',  ''random(3)'',  ''random_r(3)'',  ''rcmd(3)'',  ''readdir(3)'',  ''readdir_r(3)'',  ''realpath(3)'',  ''re_comp(3)'',  ''regex(3)'',  ''remainder(3)'',  ''remove(3)'',  ''remquo(3)'',  ''resolver(3)'',  ''rewinddir(3)'',  ''rexec(3)'',  ''rint(3)'',  ''round(3)'',  ''rpc(3)'',  ''rpmatch(3)'',  ''rtime(3)'',  ''scalb(3)'',  ''scalbln(3)'',  ''scandir(3)'',  ''scanf(3)'',  ''sched_getcpu(3)'',  ''seekdir(3)'',  ''sem_close(3)'',  ''sem_destroy(3)'',  ''sem_getvalue(3)'',  ''sem_init(3)'',  ''sem_open(3)'',  ''sem_post(3)'',  ''sem_unlink(3)'',  ''sem_wait(3)'',  ''setaliasent(3)'',  ''setbuf(3)'',  ''setenv(3)'',  ''setjmp(3)'',  ''setlocale(3)'',  ''setlogmask(3)'',  ''setnetgrent(3)'',  ''shm_open(3)'',  ''siginterrupt(3)'',  ''signbit(3)'',  ''significand(3)'',  ''sigpause(3)'',  ''sigqueue(3)'',  ''sigset(3)'',  ''sigsetops(3)'',  ''sigvec(3)'',  ''sigwait(3)'',  ''sin(3)'',  ''sincos(3)'',  ''sinh(3)'',  ''sleep(3)'',  ''sockatmark(3)'',  ''sqrt(3)'',  ''sscanf(3)'',  ''statvfs(3)'',  ''stdarg(3)'',  ''stdio_ext(3)'',  ''stpncpy(3)'',  ''strcasecmp(3)'',  ''strchr(3)'',  ''strcmp(3)'',  ''strcoll(3)'',  ''strcpy(3)'',  ''strdup(3)'',  ''strerror(3)'',  ''strfmon(3)'',  ''strfromd(3)'',  ''strfry(3)'',  ''strftime(3)'',  ''strlen(3)'',  ''strncat(3)'',  ''strnlen(3)'',  ''strpbrk(3)'',  ''strptime(3)'',  ''strsep(3)'',  ''strsignal(3)'',  ''strspn(3)'',  ''strstr(3)'',  ''strtod(3)'',  ''strtoimax(3)'',  ''strtok(3)'',  ''strtol(3)'',  ''strtoul(3)'',  ''strverscmp(3)'',  ''strxfrm(3)'',  ''swab(3)'',  ''sysconf(3)'',  ''syslog(3)'',  ''system(3)'',  ''sysv_signal(3)'',  ''tan(3)'',  ''tanh(3)'',  ''tcgetpgrp(3)'',  ''tcgetsid(3)'',  ''telldir(3)'',  ''tempnam(3)'',  ''termios(3)'',  ''tgamma(3)'',  ''timegm(3)'',  ''tmpfile(3)'',  ''tmpnam(3)'',  ''toascii(3)'',  ''toupper(3)'',  ''towctrans(3)'',  ''towlower(3)'',  ''towupper(3)'',  ''trunc(3)'',  ''tsearch(3)'',  ''ttyname(3)'',  ''ttyslot(3)'',  ''tzset(3)'',  ''ualarm(3)'',  ''ulimit(3)'',  ''ungetwc(3)'',  ''unlocked_stdio(3)'',  ''unlockpt(3)'',  ''updwtmp(3)'',  ''usleep(3)'',  ''wcpcpy(3)'',  ''wcpncpy(3)'',  ''wcrtomb(3)'',  ''wcscasecmp(3)'',  ''wcscat(3)'',  ''wcschr(3)'',  ''wcscmp(3)'',  ''wcscpy(3)'',  ''wcscspn(3)'',  ''wcsdup(3)'',  ''wcslen(3)'',  ''wcsncasecmp(3)'',  ''wcsncat(3)'',  ''wcsncmp(3)'',  ''wcsncpy(3)'',  ''wcsnlen(3)'',  ''wcsnrtombs(3)'',  ''wcspbrk(3)'',  ''wcsrchr(3)'',  ''wcsrtombs(3)'',  ''wcsspn(3)'',  ''wcsstr(3)'',  ''wcstoimax(3)'',  ''wcstok(3)'',  ''wcstombs(3)'',  ''wcswidth(3)'',  ''wctob(3)'',  ''wctomb(3)'',  ''wctrans(3)'',  ''wctype(3)'',  ''wcwidth(3)'',  ''wmemchr(3)'',  ''wmemcmp(3)'',  ''wmemcpy(3)'',  ''wmemmove(3)'',  ''wmemset(3)'',  ''wordexp(3)'',  ''wprintf(3)'',  ''xcrypt(3)'',  ''xdr(3)'',  ''y0(3)'',  ''man-pages(7)'',  ''pthreads(7)'',  ''standards(7)''
 
= Sidslut =
 
Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man7/attributes.7.html
<HR>
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/
<BR><BR>Tack till [https://datorhjalp.se Datorhjälp] som har  sponsrat [https://www.linux.se Linux.se] med webbhotell.
 
[[Kategori:Övrig Informationsmanual]]
[[Kategori:Linuxmanual]]

Versionen från 25 november 2024 kl. 08.32

attributes(7)

NAMN

attributes - POSIX-säkerhetskoncept

BESKRIVNING

Obs: Texten i denna man-sida är baserad på material hämtat från avsnittet "POSIX-säkerhetskoncept" i GNU C Library-manualen. Ytterligare information om ämnena som beskrivs här finns i den manualen.

Flera funktionsmanualsidor innehåller ett avsnitt ATTRIBUTES som beskriver hur säkert det är att anropa funktionen i olika sammanhang. Detta avsnitt markerar funktioner med följande säkerhetsklassificeringar:

MT-Safe

MT-Safe (trådsäkra) funktioner är säkra att kalla i närvaro av andra trådar. MT i MT-Safe står för Multi Thread.

  • Att vara MT-Safe innebär inte att en funktion är atomisk eller att den använder några av de mekanismer för minnessynkronisering som POSIX tillhandahåller användare.
  • Att anropa flera MT-Safe-funktioner i följd garanterar inte att kombinationen av dessa är MT-Safe. Samtidiga anrop från andra trådar kan påverka destruktivt.
  • Optimeringar på hela programnivån som inline-funktioner kan exponera osäker omordning. Därför rekommenderas inte inlining över GNU C Library-gränssnittet.

MT-Unsafe

MT-Unsafe-funktioner är inte säkra att anropa i program som är multitrådade.

Villkorligt säkra funktioner

För vissa funktioner som är osäkra i vissa sammanhang finns det sätt att hantera problemen utan att helt undvika funktionen. Följande nyckelord används för att indikera dessa problem, och varje definition anger hur hela programmet behöver begränsas för att göra funktionen säker:

  • init

Funktioner markerade med init utför osäker initialisering vid första anropet. Att kalla funktionen minst en gång i ett enkeltrådat läge eliminerar denna osäkerhet.

  • race

Funktionen orsakar datarace vid parallell exekvering, t.ex. genom att modifiera gemensamma resurser.

  • const

Modifierar interna objekt på ett icke-atomiskt sätt som bör betraktas som konstanta.

  • sig

Funktionen kan tillfälligt installera en signalhanterare för interna ändamål. Detta kan störa andra signalanvändningar.

  • term

Kan ändra terminalinställningar på ett sätt som orsakar förlust av ändringar från andra trådar.

Andra säkerhetsanmärkningar

Vissa nyckelord kan användas för att markera funktioner som inte är direkt osäkra men som kan behöva övervägas i vissa typer av program:

  • locale

Fungerar utan synkronisering med aktuella lokala inställningar.

  • env

Funktioner som åtkommer miljövariabler utan synkronisering.

  • hostid

Funktioner som läser värddatorns systemidentifierare utan atomisk åtkomst.

  • sigintr

Åtkomst till interna signaldata utan att garantera trådsäkerhet.

  • cwd

Ändrar tillfälligt arbetskatalogen, vilket kan påverka relativ sökvägsupplösning i andra trådar.

SE ÄVEN

attributes(7) – Diverse informationsmanual

NAMN

attributes – POSIX säkerhetskoncept

BESKRIVNING

Observera: Texten i denna man-sida är baserad på material hämtat från avsnittet "POSIX Safety Concepts" i GNU C Library-manualen. Ytterligare detaljer om de ämnen som beskrivs här kan hittas i den manualen.

Olika funktionsmanualsidor inkluderar en sektion ATTRIBUTES som beskriver säkerheten vid anrop av funktionen i olika sammanhang. Denna sektion annoterar funktioner med följande säkerhetsmarkeringar:

MT-Safe

MT-Safe eller trådsäkra funktioner är säkra att anropa i närvaro av andra trådar. MT i MT-Safe står för Multi Thread.

Att vara MT-Safe innebär dock inte att en funktion är atomär, eller att den använder någon av de minnessynkroniseringsmekanismer som POSIX exponerar för användare. Det är till och med möjligt att anrop av MT-Safe-funktioner i följd inte ger en MT-Safe kombination. Till exempel garanterar inte att en tråd anropar två MT-Safe-funktioner direkt efter varandra ett beteende som motsvarar atomär exekvering av kombinationen av båda funktionerna, eftersom samtidiga anrop i andra trådar kan störa på ett destruktivt sätt.

Helprogramoptimeringar som kan inlinera funktioner över biblioteksgränssnitt kan exponera osäker omordning, och därför rekommenderas inte inlining över GNU C Library-gränssnittet. Den dokumenterade MT-Safety-statusen garanteras inte under helprogramoptimering. Dock är funktioner definierade i användar-synliga headers designade att vara säkra för inlining.

MT-Unsafe

MT-Unsafe-funktioner är inte säkra att anropa i multitrådade program.

Andra nyckelord som förekommer i säkerhetsanmärkningar definieras i följande sektioner.

Villkorligt säkra funktioner

För vissa funktioner som gör funktioner osäkra att anropa i vissa sammanhang finns det kända sätt att undvika säkerhetsproblemet annat än att helt avstå från att anropa funktionen. De följande nyckelorden refererar till sådana funktioner, och var och en av deras definitioner indikerar hur hela programmet behöver begränsas för att eliminera säkerhetsproblemet som indikeras av nyckelordet. Endast när alla skäl som gör en funktion osäker är observerade och åtgärdade, genom att tillämpa de dokumenterade begränsningarna, blir funktionen säker att anropa i ett sammanhang.

init

Funktioner märkta med init som en MT-Unsafe-egenskap utför osäker initialisering när de anropas första gången.

Att anropa en sådan funktion minst en gång i enkeltrådigt läge tar bort denna specifika orsak för att funktionen ska betraktas som MT-Unsafe. Om ingen annan orsak kvarstår kan funktionen därefter säkert anropas efter att andra trådar har startats.

race

Funktioner annoterade med race som ett MT-Safety-problem opererar på objekt på sätt som kan orsaka data-kapplöpningar eller liknande former av destruktiv interferens vid samtidig exekvering. I vissa fall skickas objekten till funktionerna av användare; i andra används de av funktionerna för att returnera värden till användare; i ytterligare andra exponeras de inte ens för användare.

const

Funktioner märkta med const som ett MT-Safety-problem modifierar icke-atomärt interna objekt som bättre betraktas som konstanta, eftersom en stor del av GNU C Library får åtkomst till dem utan synkronisering. Till skillnad från race, som gör både läsare och skribenter av interna objekt osäkra, tillämpas denna markering endast på skribenter. Skribenter förblir MT-Unsafe att anropa, men objektens då obligatoriska konstanthet som de modifierar möjliggör att läsare betraktas som MT-Safe (så länge inga andra skäl för osäkerhet kvarstår), eftersom avsaknaden av synkronisering inte är ett problem när objekten är i praktiken konstanta.

Identifikatorn som följer efter const kommer att visas ensam som en säkerhetsanmärkning i läsare. Program som vill arbeta runt detta säkerhetsproblem, för att kunna anropa skribenter, kan använda ett icke-rekursivt läs-skriv-lås associerat med identifikatorn, och skydda alla anrop till funktioner märkta med const följt av identifikatorn med ett skrivlås, och alla anrop till funktioner märkta med identifikatorn ensam med ett läslås.

sig

Funktioner märkta med sig som ett MT-Safety-problem kan temporärt installera en signalhanterare för interna ändamål, vilket kan störa andra användningar av signalen, identifierad efter ett kolon.

Detta säkerhetsproblem kan undvikas genom att säkerställa att inga andra användningar av signalen kommer att äga rum under samtalet. Att hålla ett icke-rekursivt mutexlås medan man anropar alla funktioner som använder samma temporära signal; att blockera den signalen före anropet och återställa dess hanterare efteråt rekommenderas.

term

Funktioner märkta med term som ett MT-Safety-problem kan ändra terminalinställningarna på det rekommenderade sättet, nämligen: anropa tcgetattr(3), modifiera vissa flaggor, och sedan anropa tcsetattr(3). Detta skapar ett fönster där ändringar gjorda av andra trådar går förlorade. Således är funktioner märkta med term MT-Unsafe.

Det är därför tillrådligt för applikationer som använder terminalen att undvika samtidiga och reentranta interaktioner med den, genom att inte använda den i signalhanterare eller blockera signaler som kan använda den, och hålla ett lås medan man anropar dessa funktioner och interagerar med terminalen. Detta lås bör också användas för ömsesidig uteslutning med funktioner märkta med race:tcattr(fd), där fd är en filbeskrivare för den styrande terminalen. Anroparen kan använda en enda mutex för enkelhetens skull, eller använda en mutex per terminal, även om de refereras till av olika filbeskrivare.

Andra säkerhetsanmärkningar

Ytterligare nyckelord kan bifogas funktioner, vilket indikerar funktioner som inte gör en funktion osäker att anropa, men som kan behöva beaktas i vissa programklasser:

locale

Funktioner annoterade med locale som ett MT-Safety-problem läser från lokalobjektet utan någon form av synkronisering. Funktioner annoterade med locale som anropas samtidigt med lokala ändringar kan bete sig på sätt som inte motsvarar någon av de lokaler som är aktiva under deras exekvering, utan en oförutsägbar blandning av dem.

Vi markerar inte dessa funktioner som MT-Unsafe, eftersom funktioner som modifierar lokalobjektet är märkta med const:locale och betraktas som osäkra. Eftersom de är osäkra ska de senare inte anropas när flera trådar körs eller asynkrona signaler är aktiverade, och därför kan lokalen betraktas som i praktiken konstant i dessa sammanhang, vilket gör de tidigare säkra.

env

Funktioner märkta med env som ett MT-Safety-problem får åtkomst till miljön med getenv(3) eller liknande, utan några skydd för att säkerställa säkerhet i närvaro av samtidiga modifieringar.

Vi markerar inte dessa funktioner som MT-Unsafe, eftersom funktioner som modifierar miljön alla är märkta med const:env och betraktas som osäkra. Eftersom de är osäkra ska de senare inte anropas när flera trådar körs eller asynkrona signaler är aktiverade, och därför kan miljön betraktas som i praktiken konstant i dessa sammanhang, vilket gör de tidigare säkra.

hostid

Funktionen märkt med hostid som ett MT-Safety-problem läser från systemövergripande datastrukturer som håller maskinens "host ID". Dessa datastrukturer kan generellt inte modifieras atomärt. Eftersom det förväntas att "host ID" normalt inte kommer att ändras, betraktas funktionen som läser från den (gethostid(3)) som säker, medan funktionen som modifierar den (sethostid(3)) är märkt med const:hostid, vilket indikerar att den kan kräva särskild omsorg om den ska anropas. I detta specifika fall motsvarar den särskilda omsorgen systemövergripande (inte bara inom process) koordination.

sigintr

Funktioner märkta med sigintr som ett MT-Safety-problem får åtkomst till GNU C Librarys interna datastruktur _sigintr utan några skydd för att säkerställa säkerhet i närvaro av samtidiga modifieringar.

Vi markerar inte dessa funktioner som MT-Unsafe, eftersom funktioner som modifierar denna datastruktur alla är märkta med const:sigintr och betraktas som osäkra. Eftersom de är osäkra ska de senare inte anropas när flera trådar körs eller asynkrona signaler är aktiverade, och därför kan datastrukturen betraktas som i praktiken konstant i dessa sammanhang, vilket gör de tidigare säkra.

cwd

Funktioner märkta med cwd som ett MT-Safety-problem kan temporärt ändra den aktuella arbetskatalogen under sin exekvering, vilket kan orsaka att relativa sökvägar löses på oväntade sätt i andra trådar eller inom asynkrona signal- eller avbrythanterare.

Detta är inte tillräckligt för att markera så märkta funktioner som MT-Unsafe, men när detta beteende är valfritt (t.ex. nftw(3) med FTW_CHDIR), kan det vara ett bra alternativ att undvika alternativet istället för att använda fullständiga sökvägar eller filbeskrivare-relativa (t.ex. openat(2)) systemanrop.

:identifier

Annoteringar kan ibland följas av identifikatorer, avsedda att gruppera flera funktioner som, till exempel, får åtkomst till datastrukturer på ett osäkert sätt, som i race och const, eller för att ge mer specifik information, såsom att namnge en signal i en funktion märkt med sig. Det förutses att det kan tillämpas på lock och corrupt också i framtiden.

I de flesta fall kommer identifikatorn att namnge en uppsättning funktioner, men den kan namnge globala objekt eller funktionsargument, eller identifierbara egenskaper eller logiska komponenter associerade med dem, med en notation som, till exempel, :buf(arg) för att beteckna en buffer associerad med argumentet arg, eller :tcattr(fd) för att beteckna terminalattributen för en filbeskrivare fd.

Den vanligaste användningen för identifikatorer är att tillhandahålla logiska grupper av funktioner och argument som behöver skyddas av samma synkroniseringsprimitive för att säkerställa säker drift i ett givet sammanhang.

/villkor

Vissa säkerhetsannoteringar kan vara villkorliga, i den meningen att de endast gäller om ett booleskt uttryck som involverar argument, globala variabler eller till och med den underliggande kärnan utvärderas till sant. Till exempel, /!ps och /one_per_line indikerar att den föregående markören endast gäller när argumentet ps är NULL, eller den globala variabeln one_per_line är nollskild.

När alla markeringar som gör en funktion osäker är prydda med sådana villkor, och inget av de nämnda villkoren gäller, kan funktionen betraktas som säker.

SE ÄVEN

COLOFON

Denna sida är en del av man-sidorna (dokumentation för Linux-kärnan och C-bibliotekets användargränssnitt) projekt. Information om projektet finns på man-pages-projektet. Om du har en felrapport för denna man-sida, se CONTRIBUTING. Denna sida erhölls från tarballen man-pages-6.9.1.tar.gz hämtad från [1] den 2024-06-26. Om du upptäcker några återgivningsproblem i denna HTML-version av sidan, eller du tror att det finns en bättre eller mer uppdaterad källa för sidan, eller 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   attributes(7)

Sidor som hänvisar till denna sida

adjtimex(2), clock_getres(2), eventfd(2), getrlimit(2), getrusage(2), mmap(2), sigaltstack(2), utimensat(2), a64l(3), abort(3), abs(3), acos(3), acosh(3), addseverity(3), adjtime(3), aio_cancel(3), aio_error(3), aio_fsync(3), aio_read(3), aio_return(3), aio_suspend(3), aio_write(3), alloca(3), arc4random(3), argz_add(3), asin(3), asinh(3), asprintf(3), assert(3), assert_perror(3), atan2(3), atan(3), atanh(3), atexit(3), atof(3), atoi(3), backtrace(3), basename(3), bcopy(3), bindresvport(3), bsd_signal(3), bsearch(3), btowc(3), byteorder(3), bzero(3), cabs(3), cacos(3), cacosh(3), canonicalize_file_name(3), carg(3), casin(3), casinh(3), catan(3), catanh(3), catgets(3), catopen(3), cbrt(3), ccos(3), ceil(3), cexp(3), cfree(3), cimag(3), clearenv(3), clock(3), clock_getcpuclockid(3), clog10(3), clog(3), closedir(3), confstr(3), conj(3), copysign(3), cos(3), cosh(3), cpow(3), cproj(3), creal(3), crypt(3), csin(3), csinh(3), csqrt(3), ctan(3), ctanh(3), ctermid(3), ctime(3), daemon(3), des_crypt(3), difftime(3), dirfd(3), div(3), dladdr(3), dlerror(3), dlinfo(3), dl_iterate_phdr(3), dlopen(3), dlsym(3), drand48(3), drand48_r(3), dysize(3), ecvt(3), ecvt_r(3), encrypt(3), envz_add(3), erf(3), erfc(3), err(3), error(3), ether_aton(3), euidaccess(3), exec(3), exit(3), exp10(3), exp2(3), exp(3), expm1(3), fabs(3), fclose(3), fcloseall(3), fdim(3), fenv(3), ferror(3), fexecve(3), fflush(3), ffs(3), fgetc(3), fgetgrent(3), fgetpwent(3), fgetwc(3), fgetws(3), fileno(3), finite(3), flockfile(3), floor(3), fma(3), fmax(3), fmemopen(3), fmin(3), fmod(3), fmtmsg(3), fnmatch(3), fopen(3), fopencookie(3), fpathconf(3), fpclassify(3), fpurge(3), fputwc(3), fputws(3), fread(3), frexp(3), fseek(3), fseeko(3), ftime(3), ftok(3), fts(3), ftw(3), futimes(3), gamma(3), gcvt(3), getaddrinfo(3), getaddrinfo_a(3), getauxval(3), getcontext(3), getcwd(3), getdate(3), getdirentries(3), getdtablesize(3), getenv(3), getfsent(3), getgrent(3), getgrent_r(3), getgrnam(3), getgrouplist(3), gethostbyname(3), gethostid(3), getifaddrs(3), getline(3), getloadavg(3), getlogin(3), getmntent(3), getnameinfo(3), getnetent(3), getnetent_r(3), get_nprocs(3), getopt(3), getpass(3), getprotoent(3), getprotoent_r(3), getpt(3), getpw(3), getpwent(3), getpwent_r(3), getpwnam(3), getrpcent(3), getrpcent_r(3), getrpcport(3), gets(3), getservent(3), getservent_r(3), getspnam(3), getsubopt(3), getttyent(3), getusershell(3), getutent(3), getutmp(3), getw(3), getwchar(3), glob(3), gnu_get_libc_version(3), grantpt(3), gsignal(3), hsearch(3), hypot(3), iconv(3), iconv_close(3), iconv_open(3), if_nameindex(3), if_nametoindex(3), ilogb(3), inet(3), inet_ntop(3), inet_pton(3), initgroups(3), insque(3), isalpha(3), isatty(3), isgreater(3), iswalnum(3), iswalpha(3), iswblank(3), iswcntrl(3), iswctype(3), iswdigit(3), iswgraph(3), iswlower(3), iswprint(3), iswpunct(3), iswspace(3), iswupper(3), iswxdigit(3), j0(3), key_setsecret(3), ldexp(3), lio_listio(3), localeconv(3), lockf(3), log10(3), log1p(3), log2(3), log(3), logb(3), login(3), lrint(3), lround(3), lsearch(3), lseek64(3), makecontext(3), makedev(3), mallinfo(3), malloc(3), malloc_get_state(3), malloc_info(3), malloc_stats(3), malloc_trim(3), malloc_usable_size(3), matherr(3), mblen(3), mbrlen(3), mbrtowc(3), mbsinit(3), mbsnrtowcs(3), mbsrtowcs(3), mbstowcs(3), mbtowc(3), mcheck(3), memccpy(3), memchr(3), memcmp(3), memcpy(3), memfrob(3), memmem(3), memmove(3), mempcpy(3), memset(3), mkdtemp(3), mkfifo(3), mkstemp(3), mktemp(3), modf(3), mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mtrace(3), nan(3), nextafter(3), nextup(3), nl_langinfo(3), ntp_gettime(3), on_exit(3), opendir(3), open_memstream(3), openpty(3), perror(3), popen(3), posix_fallocate(3), posix_memalign(3), posix_openpt(3), pow10(3), pow(3), __ppc_set_ppr_med(3), __ppc_yield(3), printf(3), profil(3), psignal(3), pthread_attr_init(3), pthread_attr_setaffinity_np(3), pthread_attr_setdetachstate(3), pthread_attr_setguardsize(3), pthread_attr_setinheritsched(3), pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3), pthread_attr_setscope(3), pthread_attr_setsigmask_np(3), pthread_attr_setstack(3), pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3), pthread_cancel(3), pthread_cleanup_push(3), pthread_create(3), pthread_detach(3), pthread_equal(3), pthread_exit(3), pthread_getattr_default_np(3), pthread_getattr_np(3), pthread_getcpuclockid(3), pthread_join(3), pthread_kill(3), pthread_kill_other_threads_np(3), pthread_self(3), pthread_setaffinity_np(3), pthread_setcancelstate(3), pthread_setconcurrency(3), pthread_setname_np(3), pthread_setschedparam(3), pthread_setschedprio(3), pthread_sigmask(3), pthread_sigqueue(3), pthread_testcancel(3), pthread_tryjoin_np(3), pthread_yield(3), ptsname(3), putenv(3), putgrent(3), putpwent(3), puts(3), putwchar(3), qecvt(3), qsort(3), raise(3), rand(3), random(3), random_r(3), rcmd(3), readdir(3), readdir_r(3), realpath(3), re_comp(3), regex(3), remainder(3), remove(3), remquo(3), resolver(3), rewinddir(3), rexec(3), rint(3), round(3), rpc(3), rpmatch(3), rtime(3), scalb(3), scalbln(3), scandir(3), scanf(3), sched_getcpu(3), seekdir(3), sem_close(3), sem_destroy(3), sem_getvalue(3), sem_init(3), sem_open(3), sem_post(3), sem_unlink(3), sem_wait(3), setaliasent(3), setbuf(3), setenv(3), setjmp(3), setlocale(3), setlogmask(3), setnetgrent(3), shm_open(3), siginterrupt(3), signbit(3), significand(3), sigpause(3), sigqueue(3), sigset(3), sigsetops(3), sigvec(3), sigwait(3), sin(3), sincos(3), sinh(3), sleep(3), sockatmark(3), sqrt(3), sscanf(3), statvfs(3), stdarg(3), stdio_ext(3), stpncpy(3), strcasecmp(3), strchr(3), strcmp(3), strcoll(3), strcpy(3), strdup(3), strerror(3), strfmon(3), strfromd(3), strfry(3), strftime(3), strlen(3), strncat(3), strnlen(3), strpbrk(3), strptime(3), strsep(3), strsignal(3), strspn(3), strstr(3), strtod(3), strtoimax(3), strtok(3), strtol(3), strtoul(3), strverscmp(3), strxfrm(3), swab(3), sysconf(3), syslog(3), system(3), sysv_signal(3), tan(3), tanh(3), tcgetpgrp(3), tcgetsid(3), telldir(3), tempnam(3), termios(3), tgamma(3), timegm(3), tmpfile(3), tmpnam(3), toascii(3), toupper(3), towctrans(3), towlower(3), towupper(3), trunc(3), tsearch(3), ttyname(3), ttyslot(3), tzset(3), ualarm(3), ulimit(3), ungetwc(3), unlocked_stdio(3), unlockpt(3), updwtmp(3), usleep(3), wcpcpy(3), wcpncpy(3), wcrtomb(3), wcscasecmp(3), wcscat(3), wcschr(3), wcscmp(3), wcscpy(3), wcscspn(3), wcsdup(3), wcslen(3), wcsncasecmp(3), wcsncat(3), wcsncmp(3), wcsncpy(3), wcsnlen(3), wcsnrtombs(3), wcspbrk(3), wcsrchr(3), wcsrtombs(3), wcsspn(3), wcsstr(3), wcstoimax(3), wcstok(3), wcstombs(3), wcswidth(3), wctob(3), wctomb(3), wctrans(3), wctype(3), wcwidth(3), wmemchr(3), wmemcmp(3), wmemcpy(3), wmemmove(3), wmemset(3), wordexp(3), wprintf(3), xcrypt(3), xdr(3), y0(3), man-pages(7), pthreads(7), standards(7)

Sidslut

Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man7/attributes.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.