Man page - pthreads(7)

Packages contains this manual

Available languages:

en fr ja ru

Manual

pthreads

ΠΠΠ˜ΠœΠ•ΠΠžΠ’ΠΠΠ˜Π•
ΠžΠŸΠ˜Π‘ΠΠΠ˜Π•
Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pthreads
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½ΠΈΡ‚ΠΈ
НитСбСзопасныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
БСзопасныС асинхронныС отмСняСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
Cancelation points
ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π² Linux
Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΡ‚Π΅ΠΉ POSIX Π² Linux
LinuxThreads
NPTL
ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΡ‚Π΅ΠΉ
Π’Ρ‹Π±ΠΎΡ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΡ‚Π΅ΠΉ: LD_ASSUME_KERNEL
Π‘ΠœΠžΠ’Π Π˜Π’Π• Π’ΠΠšΠ–Π•
ΠŸΠ•Π Π•Π’ΠžΠ”

ΠΠΠ˜ΠœΠ•ΠΠžΠ’ΠΠΠ˜Π•

pthreads - Π½ΠΈΡ‚ΠΈ POSIX

ΠžΠŸΠ˜Π‘ΠΠΠ˜Π•

Π’ POSIX.1 ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π½Π°Π±ΠΎΡ€ интСрфСйсов (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹) для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нитями, Π±ΠΎΠ»Π΅Π΅ извСстными ΠΊΠ°ΠΊ Π½ΠΈΡ‚ΠΈ POSIX ΠΈΠ»ΠΈ Pthreads. Π’ ΠΎΠ΄Π½ΠΎΠΌ процСссС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько Π½ΠΈΡ‚Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π­Ρ‚ΠΈ Π½ΠΈΡ‚ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΠ±Ρ‰Π΅ΠΉ глобальной ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (сСгмСнтами Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΊΡƒΡ‡ΠΈ), Π½ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΈΡ‚ΠΈ Π΅ΡΡ‚ΡŒ собствСнный стСк (автоматичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅).

Π’Π°ΠΊΠΆΠ΅, Π² POSIX.1 трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΡ‚ΠΈ ΠΈΠΌΠ΅Π»ΠΈ ΠΎΠ±Ρ‰ΠΈΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (Ρ‚. Π΅., эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ процСсса, Π° Π½Π΅ Π½ΠΈΡ‚ΠΈ):

β€’

ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса

β€’

ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса

β€’

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹ процСссов ΠΈ сСанса

β€’

Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»

β€’

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹

β€’

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ дСскрипторы

β€’

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (смотритС fcntl (2))

β€’

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов

β€’

Маска создания Ρ€Π΅ΠΆΠΈΠΌΠ° доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ( umask (2))

β€’

Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ( chdir (2)) ΠΈ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ( chroot (2))

β€’

Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ ( setitimer (2)) ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ POSIX ( timer_create (2))

β€’

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ уступчивости ( setpriority (2))

β€’

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΏΠΎ рСсурсам ( setrlimit (2))

β€’

Π˜Π·ΠΌΠ΅Ρ€ΠΈΡ‚Π΅Π»ΠΈ потрСблСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ЦП ( times (2)) ΠΈ рСсурсов ( getrusage (2))

Как ΠΈ для стСка, Π² POSIX.1 ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΈΡ‚ΠΈ:

β€’

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½ΠΈΡ‚ΠΈ (Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… pthread_t )

β€’

Маска сигналов ( pthread_sigmask (3))

β€’

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ errno

β€’

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ стСк сигнала ( sigaltstack (2))

β€’

Алгоритм ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ планирования Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ( sched (7))

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ свойства Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Linux ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΈΡ‚ΠΈ:

β€’

ΠΌΠ°Π½Π΄Π°Ρ‚Ρ‹ (смотритС capabilities (7))

β€’

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ ЦП ( sched_setaffinity (2))

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pthreads

Most pthreads functions return 0 on success, and an error number on failure. The error numbers that can be returned have the same meaning as the error numbers returned in errno by conventional system calls and C library functions. Note that the pthreads functions do not set errno . For each of the pthreads functions that can return an error, POSIX.1-2001 specifies that the function can never fail with the error EINTR .

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½ΠΈΡ‚ΠΈ

КаТдой Π½ΠΈΡ‚ΠΈ процСсса назначаСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½ΠΈΡ‚ΠΈ (ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ pthread_t ). Π­Ρ‚ΠΎΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ возвращаСтся Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ pthread_create (3), Π° Π² самой Π½ΠΈΡ‚ΠΈ Π΅Ρ‘ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pthread_self (3).

Π’Π½ΡƒΡ‚Ρ€ΠΈ процСсса гарантируСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π½ΠΈΡ‚Π΅ΠΉ (Π²ΠΎ всСх функциях pthreads, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π½ΠΈΡ‚ΠΈ, подразумСваСтся, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π° Π½ΠΈΡ‚ΡŒ ΠΈΠ· процСсса Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ).

БистСма ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½ΠΈΡ‚ΠΈ послС объСдинСния Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ ΠΈΠ»ΠΈ отсоСдинСния Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ. Π’ POSIX сказано: «Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ пытаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½ΠΈΡ‚ΠΈ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ закончился срок ΠΆΠΈΠ·Π½ΠΈ, Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ прСдсказуСмо».

НитСбСзопасныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

НитСбСзопасная функция β€” это функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ бСзопасно (Ρ‚. Π΅., это ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Π΅Π΄ΠΈΠ½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ нСзависимо ΠΎΡ‚ окруТСния) Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π½ΠΈΡ‚Π΅ΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Π’ POSIX.1-2001 ΠΈ POSIX.1-2008 трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, описанныС Π² стандартС, Π±Ρ‹Π»ΠΈ нитСбСзопасными, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

asctime()
basename()
catgets()
crypt()
ctermid() if passed a non-NULL argument
ctime()
dbm_clearerr()
dbm_close()
dbm_delete()
dbm_error()
dbm_fetch()
dbm_firstkey()
dbm_nextkey()
dbm_open()
dbm_store()
dirname()
dlerror()
drand48()
ecvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)]
encrypt()
endgrent()
endpwent()
endutxent()
fcvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)]
ftw()
gcvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)]
getc_unlocked()
getchar_unlocked()
getdate()
getenv()
getgrent()
getgrgid()
getgrnam()
gethostbyaddr() [POSIX.1-2001 only (function removed in
POSIX.1-2008)]
gethostbyname() [POSIX.1-2001 only (function removed in
POSIX.1-2008)]
gethostent()
getlogin()
getnetbyaddr()
getnetbyname()
getnetent()
getopt()
getprotobyname()
getprotobynumber()
getprotoent()
getpwent()
getpwnam()
getpwuid()
getservbyname()
getservbyport()
getservent()
getutxent()
getutxid()
getutxline()
gmtime()
hcreate()
hdestroy()
hsearch()
inet_ntoa()
l64a()
lgamma()
lgammaf()
lgammal()
localeconv()
localtime()
lrand48()
mrand48()
nftw()
nl_langinfo()
ptsname()
putc_unlocked()
putchar_unlocked()
putenv()
pututxline()
rand()
readdir()
setenv()
setgrent()
setkey()
setpwent()
setutxent()
strerror()
strsignal() [Added in POSIX.1-2008]
strtok()
system() [Added in POSIX.1-2008]
tmpnam() if passed a non-NULL argument
ttyname()
unsetenv()
wcrtomb() if its final argument is NULL
wcsrtombs() if its final argument is NULL
wcstombs()
wctomb()

БСзопасныС асинхронныС отмСняСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

БСзопасная асинхронная отмСняСмая функция (async-cancel-safe function) β€” это функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ бСзопасно Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ асинхронная ΠΎΡ‚ΠΌΠ΅Π½Π° (смотритС pthread_setcancelstate (3)).

Богласно POSIX.1-2001 ΠΈ POSIX.1-2008 Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ бСзопасными асинхронными отмСняСмыми:

pthread_cancel()
pthread_setcancelstate()
pthread_setcanceltype()

Cancelation points

POSIX.1 specifies that certain functions must, and certain other functions may, be cancelation points. If a thread is cancelable, its cancelability type is deferred, and a cancelation request is pending for the thread, then the thread is canceled when it calls a function that is a cancelation point.

The following functions are required to be cancelation points by POSIX.1-2001 and/or POSIX.1-2008:

accept()
aio_suspend()
clock_nanosleep()
close()
connect()
creat()
fcntl() F_SETLKW
fdatasync()
fsync()
getmsg()
getpmsg()
lockf() F_LOCK
mq_receive()
mq_send()
mq_timedreceive()
mq_timedsend()
msgrcv()
msgsnd()
msync()
nanosleep()
open()
openat() [Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² POSIX.1-2008]
pause()
poll()
pread()
pselect()
pthread_cond_timedwait()
pthread_cond_wait()
pthread_join()
pthread_testcancel()
putmsg()
putpmsg()
pwrite()
read()
readv()
recv()
recvfrom()
recvmsg()
select()
sem_timedwait()
sem_wait()
send()
sendmsg()
sendto()
sigpause() [Ρ‚ΠΎΠ»ΡŒΠΊΠΎ POSIX.1-2001 (ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Π° Π² список Β«ΠΌΠΎΠΆΠ΅Ρ‚Β» Π² POSIX.1-2008)]
sigsuspend()
sigtimedwait()
sigwait()
sigwaitinfo()
sleep()
system()
tcdrain()
usleep() [Ρ‚ΠΎΠ»ΡŒΠΊΠΎ POSIX.1-2001 (функция ΡƒΠ΄Π°Π»Π΅Π½Π° Π² POSIX.1-2008)]
wait()
waitid()
waitpid()
write()
writev()

The following functions may be cancelation points according to POSIX.1-2001 and/or POSIX.1-2008:

access()
asctime()
asctime_r()
catclose()
catgets()
catopen()
chmod() [Added in POSIX.1-2008]
chown() [Added in POSIX.1-2008]
closedir()
closelog()
ctermid()
ctime()
ctime_r()
dbm_close()
dbm_delete()
dbm_fetch()
dbm_nextkey()
dbm_open()
dbm_store()
dlclose()
dlopen()
dprintf() [Added in POSIX.1-2008]
endgrent()
endhostent()
endnetent()
endprotoent()
endpwent()
endservent()
endutxent()
faccessat() [Added in POSIX.1-2008]
fchmod() [Added in POSIX.1-2008]
fchmodat() [Added in POSIX.1-2008]
fchown() [Added in POSIX.1-2008]
fchownat() [Added in POSIX.1-2008]
fclose()
fcntl() (for any value of cmd argument)
fflush()
fgetc()
fgetpos()
fgets()
fgetwc()
fgetws()
fmtmsg()
fopen()
fpathconf()
fprintf()
fputc()
fputs()
fputwc()
fputws()
fread()
freopen()
fscanf()
fseek()
fseeko()
fsetpos()
fstat()
fstatat() [Added in POSIX.1-2008]
ftell()
ftello()
ftw()
futimens() [Added in POSIX.1-2008]
fwprintf()
fwrite()
fwscanf()
getaddrinfo()
getc()
getc_unlocked()
getchar()
getchar_unlocked()
getcwd()
getdate()
getdelim() [Added in POSIX.1-2008]
getgrent()
getgrgid()
getgrgid_r()
getgrnam()
getgrnam_r()
gethostbyaddr() [POSIX.1-2001 only (function removed in
POSIX.1-2008)]
gethostbyname() [POSIX.1-2001 only (function removed in
POSIX.1-2008)]
gethostent()
gethostid()
gethostname()
getline() [Added in POSIX.1-2008]
getlogin()
getlogin_r()
getnameinfo()
getnetbyaddr()
getnetbyname()
getnetent()
getopt() (if opterr is nonzero)
getprotobyname()
getprotobynumber()
getprotoent()
getpwent()
getpwnam()
getpwnam_r()
getpwuid()
getpwuid_r()
gets()
getservbyname()
getservbyport()
getservent()
getutxent()
getutxid()
getutxline()
getwc()
getwchar()
getwd() [POSIX.1-2001 only (function removed in POSIX.1-2008)]
glob()
iconv_close()
iconv_open()
ioctl()
link()
linkat() [Added in POSIX.1-2008]
lio_listio() [Added in POSIX.1-2008]
localtime()
localtime_r()
lockf() [Added in POSIX.1-2008]
lseek()
lstat()
mkdir() [Added in POSIX.1-2008]
mkdirat() [Added in POSIX.1-2008]
mkdtemp() [Added in POSIX.1-2008]
mkfifo() [Added in POSIX.1-2008]
mkfifoat() [Added in POSIX.1-2008]
mknod() [Added in POSIX.1-2008]
mknodat() [Added in POSIX.1-2008]
mkstemp()
mktime()
nftw()
opendir()
openlog()
pathconf()
pclose()
perror()
popen()
posix_fadvise()
posix_fallocate()
posix_madvise()
posix_openpt()
posix_spawn()
posix_spawnp()
posix_trace_clear()
posix_trace_close()
posix_trace_create()
posix_trace_create_withlog()
posix_trace_eventtypelist_getnext_id()
posix_trace_eventtypelist_rewind()
posix_trace_flush()
posix_trace_get_attr()
posix_trace_get_filter()
posix_trace_get_status()
posix_trace_getnext_event()
posix_trace_open()
posix_trace_rewind()
posix_trace_set_filter()
posix_trace_shutdown()
posix_trace_timedgetnext_event()
posix_typed_mem_open()
printf()
psiginfo() [Added in POSIX.1-2008]
psignal() [Added in POSIX.1-2008]
pthread_rwlock_rdlock()
pthread_rwlock_timedrdlock()
pthread_rwlock_timedwrlock()
pthread_rwlock_wrlock()
putc()
putc_unlocked()
putchar()
putchar_unlocked()
puts()
pututxline()
putwc()
putwchar()
readdir()
readdir_r()
readlink() [Added in POSIX.1-2008]
readlinkat() [Added in POSIX.1-2008]
remove()
rename()
renameat() [Added in POSIX.1-2008]
rewind()
rewinddir()
scandir() [Added in POSIX.1-2008]
scanf()
seekdir()
semop()
setgrent()
sethostent()
setnetent()
setprotoent()
setpwent()
setservent()
setutxent()
sigpause() [Added in POSIX.1-2008]
stat()
strerror()
strerror_r()
strftime()
symlink()
symlinkat() [Added in POSIX.1-2008]
sync()
syslog()
tmpfile()
tmpnam()
ttyname()
ttyname_r()
tzset()
ungetc()
ungetwc()
unlink()
unlinkat() [Added in POSIX.1-2008]
utime() [Added in POSIX.1-2008]
utimensat() [Added in POSIX.1-2008]
utimes() [Added in POSIX.1-2008]
vdprintf() [Added in POSIX.1-2008]
vfprintf()
vfwprintf()
vprintf()
vwprintf()
wcsftime()
wordexp()
wprintf()
wscanf()

An implementation may also mark other functions not specified in the standard as cancelation points. In particular, an implementation is likely to mark any nonstandard function that may block as a cancelation point. (This includes most functions that can touch files.)

It should be noted that even if an application is not using asynchronous cancelation, that calling a function from the above list from an asynchronous signal handler may cause the equivalent of asynchronous cancelation. The underlying user code may not expect asynchronous cancelation and the state of the user data may become inconsistent. Therefore signals should be used with caution when entering a region of deferred cancelation.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π² Linux

Π’ Linux, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс pthreads, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cc -pthread .

Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΡ‚Π΅ΠΉ POSIX Π² Linux

Π—Π° всё врСмя Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ GNU C Π±Ρ‹Π»ΠΎ Π΄Π²Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΡ‚Π΅ΠΉ для Linux:
LinuxThreads

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ рСализация pthreads. Начиная с glibc 2.4 эта рСализация большС Π½Π΅ поддСрТиваСтся.

NPTL (Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½ΠΈΡ‚Π΅ΠΉ POSIX)

БоврСмСнная рСализация pthreads. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с LinuxThreads, NPTL Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ соотвСтствуСт трСбованиям POSIX.1 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π° ΠΏΡ€ΠΈ создании большого количСства Π½ΠΈΡ‚Π΅ΠΉ. NPTL появилась Π² glibc начиная с вСрсии 2.3.2, ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ свойства, появившиСся Π² ядрС Linux 2.6.

ОбС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ, Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ рСализациями 1:1, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ каТдая Π½ΠΈΡ‚ΡŒ отобраТаСтся Π² ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ элСмСнта ядра. ОбС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ систСмный Π²Ρ‹Π·ΠΎΠ² Linux clone (2). Π’ NPTL ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ синхронизации Π½ΠΈΡ‚Π΅ΠΉ (ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹, объСдинСниС Π½ΠΈΡ‚Π΅ΠΉ ΠΈ Ρ‚ .ΠΏ.) Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° Linux futex (2).

LinuxThreads

ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свойства Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

β€’

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ (Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ) Π½ΠΈΡ‚ΠΈ, Π½ΠΈΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pthread_create (3), рСализация создаёт Β«ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽΒ» Π½ΠΈΡ‚ΡŒ. Π­Ρ‚Π° Π½ΠΈΡ‚ΡŒ выполняСт созданиС ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π½ΠΈΡ‚Π΅ΠΉ (Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ, Ссли эта Π½ΠΈΡ‚ΡŒ случайно Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ).

β€’

Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сигналы. Π’ Linux 2.2 ΠΈ Π½ΠΎΠ²Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ сигнала Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (смотритС Ρ‚Π°ΠΊΠΆΠ΅ signal (7)). Π’ старых ядрах Linux ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сигналы SIGUSR1 ΠΈ SIGUSR2 . Π’ прилоТСниях нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ сигналов, задСйствованный Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

β€’

Π£ Π½ΠΈΡ‚Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Π΅ ID процСсса (фактичСски, Π½ΠΈΡ‚ΠΈ LinuxThreads Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ процСссы, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС ΠΎΠ±Ρ‰Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π½ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ процСсса). Нити LinuxThreads (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ Π½ΠΈΡ‚ΡŒ) Π² ps (1) Π²ΠΈΠ΄ΠΈΠΌΡ‹ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ процСссы.

РСализация LinuxThreads отклоняСтся ΠΎΡ‚ спСцификации POSIX.1 Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:

β€’

Π’Ρ‹Π·ΠΎΠ² getpid (2) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹Π΅ значСния для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΈΡ‚ΠΈ.

β€’

Π’Ρ‹Π·ΠΎΠ² getppid (2) Π² нитях, ΠΊΡ€ΠΎΠΌΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ Π½ΠΈΡ‚ΠΈ; вмСсто getppid (2) Π² этих нитях Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΠ· getppid (2) Π² Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ.

β€’

Когда Π½ΠΈΡ‚ΡŒ создаёт Π½ΠΎΠ²Ρ‹ΠΉ процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ fork (2), всС Π½ΠΈΡ‚ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π² wait (2). Однако рСализация позволяСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ wait (2) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½ΠΈΡ‚ΠΈ, которая создала ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.

β€’

Когда Π½ΠΈΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ execve (2), ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π½ΠΈΡ‚ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ (Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ POSIX.1). Однако, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ процСсс ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ PID, Ρ‡Ρ‚ΠΎ ΠΈ Π½ΠΈΡ‚ΡŒ, которая Π²Ρ‹Π·Π²Π°Π»Π° execve (2): это Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ PID, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ.

β€’

Π£ Π½ΠΈΡ‚Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Π΅ ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ слоТности Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… с set-user-ID ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pthreads, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ измСняСт свои ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ seteuid (2) ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

β€’

Π£ Π½ΠΈΡ‚Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Π΅ ID сСанса ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ процСссов.

β€’

Π£ Π½ΠΈΡ‚Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Π΅ записи ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ…, созданных fcntl (2).

β€’

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ, возвращаСмая times (2) ΠΈ getrusage (2), относится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π½ΠΈΡ‚ΠΈ, Π° Π½Π΅ ΠΊ процСссу Π² Ρ†Π΅Π»ΠΎΠΌ.

β€’

Π£ Π½ΠΈΡ‚Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Π΅ значСния ΠΎΡ‚ΠΌΠ΅Π½ сСмафоров (смотритС semop (2)).

β€’

Π£ Π½ΠΈΡ‚Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ².

β€’

Π£ Π½ΠΈΡ‚Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Π΅ значСния уступчивости.

β€’

Π’ POSIX.1 Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ сигналы, адрСсованныС процСссу Π² Ρ†Π΅Π»ΠΎΠΌ ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ нитям. Богласно POSIX.1, сигналы, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ процСссу (посланныС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ kill (2)), Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Π½ΠΈΡ‚ΡŒΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ процСсса. LinuxThreads Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сигналы, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ процСссу: сигналы ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ нитям.

β€’

Нити ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ настройки Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ стСка сигналов. Однако, Π½ΠΎΠ²Ρ‹Π΅ настройки Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ стСка сигналов ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· Π½ΠΈΡ‚ΠΈ, которая Π΅Π³ΠΎ создаёт, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½ΠΈΡ‚ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ стСк сигналов (новая Π½ΠΈΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π±Π΅Π· Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ стСка сигналов. Если Π΄Π²Π΅ Π½ΠΈΡ‚ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ сигналы Π² Π΅Π΄ΠΈΠ½ΠΎΠΌ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ стСкС сигналов ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ нСпрСдсказуСмая ошибка).

NPTL

Π’ NPTL всС Π½ΠΈΡ‚ΠΈ процСсса ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½Ρƒ Π³Ρ€ΡƒΠΏΠΏΡƒ Π½ΠΈΡ‚Π΅ΠΉ; всС Ρ‡Π»Π΅Π½Ρ‹ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½ΠΈΡ‚Π΅ΠΉ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ PID. Π’ NPTL Π½Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ Π½ΠΈΡ‚ΠΈ.

Π’Π½ΡƒΡ‚Ρ€ΠΈ NPTL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° сигнала Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ; эти сигналы нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² прилоТСниях. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ смотритС Π² nptl (7).

NPTL Ρ‚ΠΎΠΆΠ΅ Π½Π΅ соотвСтствуСт POSIX.1, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Π² ΠΎΠ΄Π½ΠΎΠΌ:

β€’

Π£ Π½ΠΈΡ‚Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Π΅ значСния уступчивости.

НСсколько нСсоотвСтствий NPTL проявляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со старыми ядрами:

β€’

The information returned by times (2) and getrusage (2) is per-thread rather than process-wide (fixed in Linux 2.6.9).

β€’

Threads do not share resource limits (fixed in Linux 2.6.10).

β€’

Threads do not share interval timers (fixed in Linux 2.6.12).

β€’

Only the main thread is permitted to start a new session using setsid (2) (fixed in Linux 2.6.16).

β€’

Only the main thread is permitted to make the process into a process group leader using setpgid (2) (fixed in Linux 2.6.16).

β€’

Threads have distinct alternate signal stack settings. However, a new thread’s alternate signal stack settings are copied from the thread that created it, so that the threads initially share an alternate signal stack (fixed in Linux 2.6.16).

Π’Π°ΠΊΠΆΠ΅ стоит ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ NPTL:

β€’

Если мягкоС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ рСсурса Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ стСка (смотритС описаниС RLIMIT_STACK Π² setrlimit (2)) устанавливаСтся Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ unlimited , Ρ‚ΠΎ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ опрСдСляСт Ρ€Π°Π·ΠΌΠ΅Ρ€ стСка ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π½ΠΎΠ²Ρ‹Ρ… Π½ΠΈΡ‚Π΅ΠΉ. Π’ цСлях эффСктивности, это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ установлСно Π½ΠΎ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнной ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ulimit -s ( limit stacksize Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ C).

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΡ‚Π΅ΠΉ

Начиная с glibc 2.3.2, для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΡ‚Π΅ΠΉ Π² систСмС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ getconf (1), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

bash$ getconf GNU_LIBPTHREAD_VERSION
NPTL 2.3.4

ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ старых вСрсий glibc ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

bash$ $( ldd /bin/ls | grep libc.so | awk '{print $3}' ) | \
egrep -i 'threads|nptl'
Native POSIX Threads Library by Ulrich Drepper et al

Π’Ρ‹Π±ΠΎΡ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΡ‚Π΅ΠΉ: LD_ASSUME_KERNEL

Π’ систСмах с glibc, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈ LinuxThreads ΠΈ NPTL (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, glibc 2.3. x ), ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния LD_ASSUME_KERNEL для Π·Π°ΠΌΠ΅Π½Ρ‹ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ динамичСским ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΡ‚Π΅ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚Π° пСрСмСнная ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ динамичСскому ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ запускаСтся с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ вСрсиСй ядра Π² систСмС. Π£ΠΊΠ°Π·Π°Π² Π²Π΅Ρ€ΡΠΈΡŽ ядра, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ NPTL, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ LinuxThreads (Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ вСроятной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ для этого Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ запуска (сломанного) прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ зависит ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ совмСстимого повСдСния LinuxThreads). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \
awk '{print $3}' ) | egrep -i 'threads|nptl'
linuxthreads-0.10 by Xavier Leroy

Π‘ΠœΠžΠ’Π Π˜Π’Π• Π’ΠΠšΠ–Π•

clone (2), fork (2), futex (2), gettid (2), proc (5), attributes (7), futex (7), nptl (7), sigevent (3type), signal (7)

Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ справочныС страницы pthreads, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: pthread_atfork (3), pthread_attr_init (3), pthread_cancel (3), pthread_cleanup_push (3), pthread_cond_signal (3), pthread_cond_wait (3), pthread_create (3), pthread_detach (3), pthread_equal (3), pthread_exit (3), pthread_key_create (3), pthread_kill (3), pthread_mutex_lock (3), pthread_mutex_unlock (3), pthread_mutexattr_destroy (3), pthread_mutexattr_init (3), pthread_once (3), pthread_spin_init (3), pthread_spin_lock (3), pthread_rwlockattr_setkind_np (3), pthread_setcancelstate (3), pthread_setcanceltype (3), pthread_setspecific (3), pthread_sigmask (3), pthread_sigqueue (3) ΠΈ pthread_testcancel (3)

ΠŸΠ•Π Π•Π’ΠžΠ”

Русский ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ этой страницы руководства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»(ΠΈ) Alexey, Azamat Hackimov <azamat.hackimov@gmail.com>, kogamatranslator49 <r.podarov@yandex.ru>, Darima Kogan <silverdk99@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> ΠΈ Kirill Rekhov <krekhov.dev@gmail.com>

Π­Ρ‚ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ являСтся свободной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ; ΠΎΠ½ распространяСтся Π½Π° условиях общСдоступной Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html вСрсии 3 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ) Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ авторского ΠΏΡ€Π°Π²Π°, Π½ΠΎ Π‘Π•Π— КАКИΠ₯-Π›Π˜Π‘Πž Π“ΠΠ ΠΠΠ’Π˜Π™.

Если Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ошибки Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ этой страницы руководства, поТалуйста, сообщитС ΠΎΠ± этом Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ(Π°ΠΌ) ΠΏΠΎ Π΅Π³ΠΎ(ΠΈΡ…) адрСсу(Π°ΠΌ) элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΈΠ»ΠΈ ΠΏΠΎ адрСсу списка рассылки русских ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠΎΠ² .