#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 Π²ΠΊΠ»ΡΡΠ°ΡΡ: