Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 121

Автор Уильям БтивСнс

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Posix для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² случаС ошибки. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° систСмных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΡ… –1 Π² случаС ошибки ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ errno Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΊΠΎΠ΄Ρƒ ошибки, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Pthread Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ошибки. НапримСр, Ссли pthread_create Π½Π΅ смоТСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ·-Π·Π° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΡ систСмного oΠ³Ρ€aΠ½ΠΈΡ‡eния Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ, эта функция Π²Π΅Ρ€Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EAGAIN. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Pthread Π½Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno. НСсоотвСтствий ΠΏΡ€ΠΈ ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π΅ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΠ΄ΠΎΠ² ошибок Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния (<sys/errno.h>).

Ѐункция pthread_join

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ процСсса, Π²Ρ‹Π·Π²Π°Π² pthread_join. Бравнивая ΠΏΠΎΡ‚ΠΎΠΊΠΈ с процСссами Unix, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ pthread_create Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° fork, a pthread_join β€” waitpid:

#include <pthread.h>

int pthread_join(pthread_t tid, void **status);

/* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π•Ρ…Ρ…Ρ… – Π² случаС ошибки */

ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ. К соТалСнию, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ оТидания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Π°Π½Π°Π»ΠΎΠ³Π° waitpid с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ процСсса –1 Π½Π΅Ρ‚).

Если ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ status Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚) сохраняСтся Π² ячСйкС памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ status.

Ѐункция pthread_self

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° имССтся свой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ возвращаСтся pthread_create ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ pthread_join. ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ·Π½Π°Ρ‚ΡŒ свой собствСнный ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ pthread_self:

#include <pthread.h>

pthread_t pthread_self(void);

/* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° */

Π’Ρ‹Π·ΠΎΠ² pthread_self являСтся Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ getpid для процСссов Unix.

Ѐункция pthread_detach

ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ присоСдиняСмым (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), Ρ‚Π°ΠΊ ΠΈ отсоСдинСнным. ΠŸΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ присоСдиняСмого ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ статус Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ pthread_join. ΠžΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ процСссу-Π΄Π΅ΠΌΠΎΠ½Ρƒ. ПослС Π΅Π³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ всС рСсурсы ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ. Никакой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. Если имССтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ оТидания ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ послСдний присоСдиняСмым.

Ѐункция pthread_detach Π΄Π΅Π»Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ отсоСдинСнным:

#include <pthread.h>

int pthread_detach(pthread_t tid);

/* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π•Ρ…Ρ…Ρ… Π² случаС ошибки */

Π­Ρ‚Π° функция вызываСтся ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΡ€ΠΈ нСобходимости ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ собствСнный статус Π² Ρ„ΠΎΡ€ΠΌΠ΅

pthread_detach(pthread_self());

Ѐункция pthread_exit

Одним ΠΈΠ· способов Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ° являСтся Π²Ρ‹Π·ΠΎΠ² pthread_exit:

#include <pthread.h>

void pthread_exit(void *status);

/* Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ */

Если ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ являСтся отсоСдинСнным, Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ статус Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ для возвращСния Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ pthread_join.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ status Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (Ρ‚ΠΈΠΏΠ° автоматичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ уничтоТаСтся ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ двумя Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ способами:

β–  Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ функция ΠΏΠΎΡ‚ΠΎΠΊΠ° (Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ pthread_create) ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ return. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эта функция Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ void, это Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ становится статусом Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°;

β–  функция main процСсса ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ exit ΠΈΠ»ΠΈ _exit. ΠŸΡ€ΠΈ этом процСсс Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, вмСстС со всСми своими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.

ΠŸΠ Π˜Π›ΠžΠ–Π•ΠΠ˜Π• Π’

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ исходныС ΠΊΠΎΠ΄Ρ‹

Π’.1. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» unpipc.h

ΠŸΠΎΡ‡Ρ‚ΠΈ всС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» unpipc.h, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС Π’.1.[1] Он ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всС стандартныС систСмныС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, Π½ΡƒΠΆΠ½Ρ‹Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ ΠΏpoΠ³Ρ€aΠΌΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΅Ρ‚ΡŒΡŽ, вмСстС с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ систСмными Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ. Он Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСт константы Ρ‚ΠΈΠΏΠ° MAXLINE ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ANSI Π‘ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² тСкстС (Ρ‚ΠΈΠΏΠ° px_ipc_name), ΠΈ для всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΊΠ½ΠΈΠ³Π΅ ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΊ. ΠœΡ‹ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ эти ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹.

Листинг Π’.1. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» unpipc.h

//lib/unpipc.h

1   /* Наш Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». */

2   #ifndef __unpipc_h

3   #define __unpipc_h


4   #include "../config.h" /* ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ОБ */

5   /* "../config.h" создаСтся сцСнариСм configure */


6   /* измСняя список Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² #include, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹

7    ../aclocal.m4 ΠΈ ../configure.in. Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π» сцСнарий configure */

8   #include <sys/types.h> /* Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… */

9   #include <sys/time.h> /* структура timeval{} для select() */


10  #include <time.h> /* timespec{} для pselect() */

11  #include <errno.h>

12  #include <fcntl.h> /* ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ */

13  #include <limits.h> /* PIPE_BUF */

14  #include <signal.h>

15  #include <stdio.h>

16  #include <stdlib.h>

17  #include <string.h>

18  #include <sys/stat.h> /* константы Ρ€Π΅ΠΆΠΈΠΌΠ° доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ S_xxx */

19  #include <unistd.h>

20  #include <sys/wait.h>


21  #ifdef HAVE_MQUEUE_H

22  #include <mqueue.h> /* ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix */

23  #endif


24  #ifdef HAVE_SEMAPHORE_H

25  #include <semaphore.h> /* сСмафоры Posix */

26  #ifndef SEM_FAILED

27  #define SEM_FAILED ((sem_t *)(-1))

28  #endif

29  #endif


30  #ifdef HAVE_SYS_MMAN_H

31  #include <sys/mman.h> /* раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ Posix */

32  #endif


33  #ifndef MAP_FAILED

34  #define MAP_FAILED ((void *)(-1))

35  #endif


36  #ifdef HAVE_SYS_IPC_H

37  #include <sys/ipc.h> /* System V IPC */

38  #endif


39  #ifdef HAVE_SYS_MSG_H

40  #include <sys/msg.h> /* ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний System V */

41  #endif


42  #ifdef HAVE_SYS_SEM_H

43  #ifdef __bsdi__

44  #undef HAVE_SYS_SEM_H /* Ρ‚ΠΎΠ½ΠΊΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ semctl() Π² BSDI's содСрТит ошибки*/

45  #else

46  #include <sys/sem.h> /* сСмафоры System V */

47  #endif

48  #ifndef HAVE_SEMUN_UNION /* $$.It semun$$ */

49  union semun { /* ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ объСдинСния для semctl() */

50   int val;

51   struct semid_ds *buf;

52   unsigned short *array;

53  };

54  #endif

55  #endif /* HAVE_SYS_SEM_H */


56  #ifdef HAVE_SYS_SHM_H

57  #include <sys/shm.h> /* раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ System V */

58  #endif


59  #ifdef HAVE_SYS_SELECT_H

60  #include <sys/select.h> /* для удобства */

61  #endif


62  #ifdef HAVE_POLL_H

63  #include <poll.h> /* для удобства */

64  #endif


65  #ifdef HAVE_STROPTS_H

66  #include <stropts.h> /* для удобства */

67  #endif


68  #ifdef HAVE_STRINGS_H

69  #include <strings.h> /* для удобства */

70  #endif


71  /* Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π° Π½ΡƒΠΆΠ½Ρ‹ для ioctl Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ сокСтов:

72   * <sys/ioctl.h>, <sys/filio.h>, ΠΈ <sys/sockio.h>.

73   */

74  #ifdef HAVE_SYS_IOCTL_H

75  #include <sys/ioctl.h>

76  #endif

77  #ifdef HAVE_SYS_FILIO_H

78  #include <sys/filio.h>

79  #endif


80  #ifdef HAVE_PTHREAD_H

81  #include <pthread.h>

82  #endif

83  #ifdef HAVE_DOOR_H

84  #include <door.h> /* интСрфСйс Π΄Π²Π΅Ρ€Π΅ΠΉ Solaris */

85  #endif

86  #ifdef HAVE_RPC_RPC_H

87  #ifdef _PSX4_NSPACE_H_TS /* Π±Π°Π³ΠΈ Digital Unix 4.0b */

88  #undef SUCCESS

89  #endif

90  #include <rpc/rpc.h> /* Sun RPC */

91  #endif


92  /* ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ bzero() ΠΊΠ°ΠΊ макрос, Ссли Π΅Π³ΠΎ Π½Π΅Ρ‚ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π‘ */

93  #ifndef HAVE_BZERO

94  #define bzero(ptr,n) memset(ptr, 0, n)

95  #endif


96  /* Posix.1g Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ INFTIM ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ»ΠΎΡΡŒ Π² <poll.h>. Π½ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… систСмах эта

97     ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° всС Π΅Ρ‰Π΅ опрСдСляСтся Π² <sys/stropts.h>. Нам Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ всС

98     Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, поэтому ΠΌΡ‹ опрСдСляСм INFTM здСсь. Π­Ρ‚ΠΎ стандартноС

99     Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ –1 */

100 #ifndef INFTIM

101 #define INFTIM (-1) /* Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ врСмя опроса */

102 #ifdef HAVE_POLL_H

103 #define INFTIM_UNPH /* Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° unpxti.h ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ константа ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° */

104 #endif

105 #endif


106 /* ΠŸΡ€ΠΎΡ‡ΠΈΠ΅ константы */

107 #ifndef РАВН_МАΠ₯ /* Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π² <limits.h> */

108 #define PATH_MAX 1024 /* максимальноС количСство символов Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° */