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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 69

Автор АндрСй РобачСвский

#include <sys/sem.h>

#include <sys/shm.h>

#include "shmem.h"


main() {

 Message *msgptr;

 key_t key;

 int shmid, semid;


 /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΊΠ»ΡŽΡ‡. Один ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ

    для сСмафора, Ρ‚Π°ΠΊ ΠΈ для раздСляСмой памяти */

 if ((key = ftok("server", 'A')) < 0) {

  printf("НСвозмоТно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡\n");

  exit(1);

 }

 /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ доступ ΠΊ раздСляСмой памяти */

 if ((shmid = shmget(key, sizeof(Message), 0)) < 0) {

  printf("Ошибка доступа\n");

  exit(1);

 }


 /* ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠΌ Π΅Π΅ */

 if ((msgptr = (Message*)shmat(shmid, 0, 0)) < 0) {

  prinf("Ошибка присоСдинСния\n);

  exit(1);

 }


 /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ доступ ΠΊ сСмафору */

 if ((semid = semget(key, 2, PERM)) < 0) {

  printf("Ошибка доступа\n");

  exit(1);

 }

 /* Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ */

 if (semop(semid, &mem_lock[0], 2) < 0) {

  printf("НСвозмоТно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ\n");

  exit(1);

 }

 /* Π£Π²Π΅Π΄ΠΎΠΌΠΈΠΌ сСрвСр ΠΎ Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ */

 if (semop(semid, &proc_start[0], 1) < 0) {

  printf("НСвозмоТно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ\n");

  exit(1);

 }


 /* Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ Π² Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ сообщСниС */

 sprintf(msgptr->buff, "Здравствуй, ΠœΠΈΡ€!\n");


 /* Освободим Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ */

 if (semop(semid, &mem_unlock[0], 1) < 0) {

  printf("НСвозмоТно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ\n");

  exit(1);

 }


 /* Π–Π΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° сСрвСр Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ освободит

    Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ */

 if (semop(semid, &mem_lock[0], 2) < 0) {

  printf(НСвозмоТно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ\n");

  exit(1);

 }


 /* ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠΌΡΡ ΠΎΡ‚ области */

 if (shmdt(msgptr) < 0) {

  printf("Ошибка ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ\n");

  exit(1);

 }


 /* Π£Π΄Π°Π»ΠΈΠΌ созданныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ IPC */

 if (shmctl(shmid, IPC_RMID, 0) < 0) {

  printf("НСвозмоТно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ\n");

  exit(1);

 }


 if (semctl(semid, 0, IPC_RMID) < 0) {

  printf("НСвозмоТно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ сСмафор\n");

  exit(1);

 }

 exit(0);

}

ΠœΠ΅ΠΆΠΏΡ€ΠΎΡ†Π΅ΡΡΠ½ΠΎΠ΅ взаимодСйствиС Π² BSD UNIX. Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ систСмы мСТпроцСссного взаимодСйствия BSD UNIX Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΠ²Π°Π»ΠΈΡΡŒ рядом сообраТСний:

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π»ΠΈ ΠΎΠ½ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΈΠ»ΠΈ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… хостах сСти. НаиболСС ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Π°Ρ рСализация мСТпроцСссного взаимодСйствия, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎ этому Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΡƒΡŽ структуру ΠΈ Π±Π°Π·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ±Ρ‰Π΅ΠΉ подсистСмС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ сСти UNIX. ΠŸΡ€ΠΈ этом ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ схСмы адрСсации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΈΡ… располоТСниС, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚.Π΄. Π’ этой связи Π±Ρ‹Π»ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΎ понятиС ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½ (communication domain), ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ Π½Π°Π±ΠΎΡ€ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… характСристик взаимодСйствия.

Для обозначСния ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (процСсса), Π±Ρ‹Π» ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ β€” сокСт (socket). Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс доступа Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС UNIX, ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π°Π΄Ρ€Π΅ΡΡƒΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ числом β€” дСскриптором. Однако Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², сокСты ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сущСствуСт, ΠΏΠΎΠΊΠ° Π½Π° Π½Π΅Π³ΠΎ ссылаСтся хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· процСссов.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ характСристики взаимодСйствия Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ доступны процСссам Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ связи, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, основанный Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅ (virtual circuit) ΠΈΠ»ΠΈ Π΄Π°Ρ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°Ρ… (datagram), ΠΏΡ€ΠΈΡ‡Π΅ΠΌ эти Ρ‚ΠΈΠΏΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ согласованы для всСх ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ². ВсС сокСты условно ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° нСсколько Ρ‚ΠΈΠΏΠΎΠ², Π² зависимости ΠΎΡ‚ прСдоставляСмых ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… характСристик. ΠŸΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ этих характСристик Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚:

β–‘ Π£ΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ…

β–‘ ΠžΡ‚сутствиС дублирования Π΄Π°Π½Π½Ρ‹Ρ…

β–‘ ΠΠ°Π΄Π΅ΠΆΠ½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ…

β–‘ Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π³Ρ€Π°Π½ΠΈΡ† сообщСний

β–‘ ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ экстрСнных сообщСний

β–‘ ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ установлСниС соСдинСния

НапримСр, ΠΊΠ°Π½Π°Π»Ρ‹, рассмотрСнныС Ρ€Π°Π½Π΅Π΅, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ характСристики. ΠŸΡ€ΠΈ этом Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΈΠ΄ сплошного ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π²Ρ‹Ρ‡Π»Π΅Π½Π΅Π½ΠΈΠ΅ сообщСний ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΈ нСобходимости Π±Ρ‹Ρ‚ΡŒ обСспСчСно Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ прилоТСниями.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ экстрСнных сообщСний ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ доставки Π΄Π°Π½Π½Ρ‹Ρ… Π²Π½Π΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, это сообщСния, связанныС с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ срочными событиями, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ.

ВзаимодСйствиС с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ установлСниСм соСдинСния ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ созданиС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΌΠ΅ΠΆΠ΄Ρƒ источником ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ избавляСт ΠΎΡ‚ нСобходимости ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΡƒΡŽ сторону Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ происходит Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ этапС установлСния связи ΠΈ Π·Π°Ρ‚Π΅ΠΌ сохраняСтся для всСх ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π΄Π°Π½Π½ΠΎΠΌΡƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ.

Π’ BSD UNIX Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ основныС Ρ‚ΠΈΠΏΡ‹ сокСтов:

β–‘ Π‘ΠΎΠΊΠ΅Ρ‚ Π΄Π°Ρ‚Π°Π³Ρ€Π°ΠΌΠΌ (datagram socket), Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСтся тСорСтичСски нСнадСТная, нСсвязная ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

β–‘ Π‘ΠΎΠΊΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° (stream socket), Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСтся надСТная ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² Π±Π΅Π· сохранСния Π³Ρ€Π°Π½ΠΈΡ† сообщСний. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ сокСтов ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ экстрСнных Π΄Π°Π½Π½Ρ‹Ρ….

β–‘ Π‘ΠΎΠΊΠ΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² (packet socket), Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСтся надСТная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· дублирования с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ установлСниСм связи. ΠŸΡ€ΠΈ этом ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ сообщСний.

β–‘ Π‘ΠΎΠΊΠ΅Ρ‚ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня (raw socket), Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСтся нСпосрСдствСнный доступ ΠΊ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ.

НаконСц, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ нСзависимыС процСссы ΠΈΠΌΠ΅Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, для сокСтов Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ пространство ΠΈΠΌΠ΅Π½. Имя сокСта ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ создан. Если для IPC System V ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ»ΡŽΡ‡ΠΈ, Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° сокСтов прСдставлСны адрСсами.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс сокСтов

Π˜Ρ‚Π°ΠΊ, сокСты ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ интСрфСйсом Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… процСссов. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ взаимодСйствия зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… сокСтов, Π° ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½, Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ создан сокСт, опрСдСляСт Π±Π°Π·ΠΎΠ²Ρ‹Π΅ свойства этого взаимодСйствия. Π’ Ρ‚Π°Π±Π». 3.6 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ‚ΠΈΠΏΡ‹ сокСтов ΠΈ ΠΈΡ… названия.


Π’Π°Π±Π»ΠΈΡ†Π° 3.6. Π’ΠΈΠΏΡ‹ сокСтов Π² систСмС BSD UNIX

НазваниС Π’ΠΈΠΏ SOCK_DGRAM Π‘ΠΎΠΊΠ΅Ρ‚ Π΄Π°Ρ‚Π°Π³Ρ€Π°ΠΌΠΌ SOCK_STREAM Π‘ΠΎΠΊΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° SOCK_SEQPACKET Π‘ΠΎΠΊΠ΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² SOCK_RAW Π‘ΠΎΠΊΠ΅Ρ‚ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня

Для создания сокСта процСсс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ сокСта ΠΈ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½, Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ сокСт. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ использованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ², процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» для взаимодСйствия. Если Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, систСма Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящий ΠΈΠ· списка ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ², доступных для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°. Если ΠΆΠ΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° созданиС сокСта Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚.Π΅. отсутствуСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», запрос процСсса Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ.

Для создания сокСта ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ систСмный Π²Ρ‹Π·ΠΎΠ² socket(2)[44], ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

#include <sys/types.h>

#include <sys/socket.h>


int socket(int domain, int type, int protocol);

Π—Π΄Π΅ΡΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ domain опрСдСляСт ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½, type β€” Ρ‚ΠΈΠΏ сокСта, a protocol β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» (ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚.Π΅. ΠΏΡ€ΠΈΡ€Π°Π²Π½Π΅Π½ 0). Π’ случаС успСха систСмный Π²Ρ‹Π·ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΌΡƒ дСскриптору, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слуТит для адрСсации Π΄Π°Π½Π½ΠΎΠ³ΠΎ сокСта Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ….

По сущСству ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½ опрСдСляСт сСмСйство ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² (protocol family), допустимых Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° domain Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚: