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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 56

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

 return EOK;

}

Запустим ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ происходит Π΅Π³ΠΎ установка Π² систСмС:

/dev # ls -l /dev/w*

nrw-rw-rw- 1 root root 0 Nov 09 23:17 /dev/wmng

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚:

void main(int argc, char *argv[]) {

 char sResName[_POSIX_PATH_MAX + 1] = "/dev/wmng";

 if (argc > 1) strcpy(sResName, argv[1]);

 int df = open(sResName, O_RDWR | O_NONBLOCK);

 if (df < 0)

  perror("device open"), exit(EXIT_FAILURE);

 cout << open << sResName

  << " , desc. = " << df << endl;

 char ibuf[2048], obuf[2048];

 int r, w;

 while (true) {

  if ((r = read(df, obuf, sizeof(obuf))) < 0) break;

  cout << '#' << obuf << endl; cout << '>' << flush;

  cin >> ibuf;

  if (( w = write(df, ibuf, strlen(ibuf) + 1)) <= 0) break;

 }

 if (r < 0) perror("read error");

 if (w <= 0) perror("write error");

 exit(EXIT_FAILURE);

}

Запустим ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ 2 экзСмпляра ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (ΠΈΡ…, собствСнно, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ) ΠΈ убСдимся, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со своСй ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ структур Π΄Π°Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ процСсса ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурса:

# wmclient

open /dev/wmng , desc. = 3 #

>1234

#1234

>54321

#54321

>

# wmclient

open /dev/wmng , desc. = 3

#

>qwerty

#qwerty

>asdf

#asdf >

ΠžΡ‚Ρ‡Π΅Ρ‚Π»ΠΈΠ²ΠΎ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ своСго Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора (Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ это дСскриптор соСдинСния) ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈ свой экзСмпляр Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΠΎΠ»Π½ΡƒΡŽ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выполнСния read() Π² Ρ‚ΠΎ врСмя, ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ занят Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ read() ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°) ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ псСвдоустройству ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ слоТнСС. Для этого Π² ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния/записи слСдуСт внСсти ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, sleep() ΠΈΠ»ΠΈ delay()) ΠΈ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ достаточно ΠΏΠ»ΠΎΡ‚Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ запросов со стороны Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Π’Π°ΠΊΠΈΠ΅ экспСримСнты ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΠ»Π½ΡƒΡŽ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌ дСскрипторам, Ρ‡Ρ‚ΠΎ обСспСчиваСтся ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” iofunc_lock_ocb_default().

БообщСния ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€?

Π­Ρ‚ΠΎΡ‚ вопрос Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ (Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ!) Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ приступаСт ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, особСнно Ссли Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° распрСдСляСтся ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΌΠΈ процСссами. Вакая структуризация ΠΈ вовсС Π½Π΅ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, приходящим ΠΈΠ· ΠΌΠΈΡ€Π° Windows. Для UNIX созданиС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… пороТдаСтся нСсколько процСссов, такая структуризация ΡƒΠΆΠ΅ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΡ‡Π½Π΅Π΅, Π½ΠΎ ΠΈ Ρ‚Π°ΠΌ это Ρ‡Π°Ρ‰Π΅ всСго лишь ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ сСрвСрного процСсса посрСдством fork(). QNX прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ΄Ρ‚ΠΈ Π΅Ρ‰Π΅ дальшС Π² построСнии ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, прСдставлСнных (Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ…) ΠΊΠ°ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ° Ρ€Π°Π·Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Ρ… Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… процСссов:

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

β€’ ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ QNX ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ всС качСства Ρ‚Π°ΠΊΠΎΠ²Ρ‹Ρ… ΠΈ Π² UNIX Π²ΠΎΠΎΠ±Ρ‰Π΅: ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ сущностями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚, Ссли это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ достаточно тяТСловСсныС (Ρ€Π°ΡΡ‚ΠΎΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅) ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ IPC. БобствСнно, Π² этом ΠΈ Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ процСссов с ΠΈΡ… ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ адрСсными пространствами β€” это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ обСспСчСния высокой надСТности ΠΈ ТивучСсти ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Но QNX, Π½Π΅ суТая спСктр общСпринятых IPC-ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², привносит ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ «слой» инструмСнтария взаимодСйствия β€” ΠΎΠ±ΠΌΠ΅Π½ сообщСниями микроядра. ΠŸΡ€ΠΈ этом Β«ΠΏΡ€ΠΎΠ½ΠΈΡ†Π°Π΅ΠΌΠΎΡΡ‚ΡŒΒ» процСссов ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ»Π΅Ρ‚ΠΎΠΊ ΠΆΠΈΠ²ΠΎΠ³ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΌΠ° становится ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅, нисколько Π½Π΅ сниТая ΠΈΡ… «защищСнности».

Но Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ для выраТСния этого «слоя» взаимодСйствий Π² своСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅: Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями (низкоуровнСвая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°, извСстная Π΅Ρ‰Π΅ со Π²Ρ€Π΅ΠΌΠ΅Π½ QNX 4.X) ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурса. Π”Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ приходится Π½Π° этапС Ρ€Π°Π½Π½Π΅Π³ΠΎ эскизного проСктирования систСмы, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ систСму с ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π² Ρ…ΠΎΠ΄Π΅ развития β€” достаточно Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΉ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ пСрСсмотра ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… основ Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, приступая ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°ΠΏΡ€ΠΈΠΎΡ€Π½ΠΎ, Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° фактичСской Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΎΡ‚Ρ‡Π΅Ρ‚Π»ΠΈΠ²ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅ΠΌ ΠΈ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями.

Π”Π²Π΅ стороны Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°

ΠŸΡ€ΠΈ рассмотрСнии Π±Π°Π·ΠΎΠ²ΠΎΠΉ для QNX (собствСнно, для всСх микроядСрных ОБ) Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями Π² сравнСнии с Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ написания ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² рСсурсов Π½Π΅ ΠΏΠΎΠΊΠΈΠ΄Π°Π΅Ρ‚ ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ схоТСсти происходящих Π² ΠΎΠ±ΠΎΠΈΡ… случаях процСссов. Π’ этом Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ инструмСнтарий ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² рСсурсов β€” это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ систСма Π²Π½Π΅ΡˆΠ½ΠΈΡ… Β«ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΊΒ» Π½Π°Π΄ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями.

Для эффСктивного примСнСния Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌΠΎΠ³ΠΎ инструмСнтария: простота, Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ, ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ, Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, возмоТности внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Π½Π° этапС Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ сопровоТдСния. Π­Ρ‚ΠΈΠΌ ΠΌΡ‹ ΠΈ займСмся Π² ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ части Π³Π»Π°Π²Ρ‹.

ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° ΠΈ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ прямого ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями ΠΊΡ€Π°ΠΉΠ½Π΅ просто выраТаСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Когда достигнута полная ΡΡΠ½ΠΎΡΡ‚ΡŒ Π² значСниях адрСсных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΠ±ΠΌΠ΅Π½Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ всСго лишь нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всС это Β«ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒΡΡΒ».

Π‘ΠΎ стороны сСрвСра, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, это выглядит Ρ‚Π°ΠΊ:

int chid = ChannelCreate(0);

...

while (true) {

 struct _msg_info info;

 int rcvid = MsgReceive(chid, &bufin, sizeof(bufin), &info);

 if (rcvid < 0) exit(EXIT_FAILURE);

 if (MsgReply(rcvid, EOK, &bufou, sizeof(bufou) < 0) exit(EXIT_FAILURE);

}

Co стороны ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:

int coid = ConnectAttach(node, pid, chid, _NTO_SIDE_CHANNEL, 0);

if (coid < 0) exit(EXIT_FAILURE);

...

while(...)

 if (MsgSend(coid, &bufou, sizeof(bufou), &bufin, sizeof(bufin)) == -1)

  exit(EXIT_FAILURE);

}

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

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, вСсь достаточно ΠΎΠ±ΡŠΠ΅ΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ любого ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурса β€” это ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ шаблона для написания ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ². ΠŸΡ€ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π½Π°Π²Ρ‹ΠΊΠ°Ρ… написаниС самых замысловатых ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² рСсурсов становится ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€ΡƒΡ‚ΠΈΠ½Π½Ρ‹ΠΌ занятиСм, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎ трудоСмкости написаниС простого ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями. Π‘ΠΎΠ»ΡŒΡˆΠΈΠΌ ΠΏΠΎΠ΄ΡΠΏΠΎΡ€ΡŒΠ΅ΠΌ здСсь являСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ тСхничСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ QNX ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ (Π±ΠΎΠ»Π΅Π΅ 80 страниц) Ρ€Π°Π·Π΄Π΅Π»Π°, ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ создания ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² рСсурсов; ΠΏΠΎ качСству ΠΈ скрупулСзности излоТСния это ΠΎΠ΄Π½Π° ΠΈΠ· Π»ΡƒΡ‡ΡˆΠΈΡ… частСй всСй тСхничСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ

ΠŸΡ€ΠΈ установлСнии соСдинСния Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° простого ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями Π² качСствС адрСсата сообщСний (сСрвСра) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Β«ΠΌΠ°Π³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚Ρ€ΠΎΠΉΠΊΡƒΒ» (Ρ‚Ρ€ΠΈΠΏΠ»Π΅Ρ‚ [1]) ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ND, PID ΠΈ CHID, Π³Π΄Π΅:

β€’ ND β€” дСскриптор сСтСвого ΡƒΠ·Π»Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π°Ρ нас ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-сСрвСр (ΡƒΠ·Π΅Π», Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π΄ΠΎ ΠΎΡ‚ΡΡ‹Π»Π°Ρ‚ΡŒ сообщСниС);

β€’ PID β€” PID процСсса этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° своСм сСтСвом ΡƒΠ·Π»Π΅ (ΠΊΠΎΠΌΡƒ ΠΎΡ‚ΡΡ‹Π»Π°Ρ‚ΡŒ сообщСниС);

β€’ CHID β€” Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Π»Π° эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°.

Π’ этой адрСсации, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, ΠΈ кроСтся самая главная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° нСгибкости ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями. ДСскриптор сСтСвого ΡƒΠ·Π»Π° nd, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, способно ΡΠ°ΠΌΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² сСти с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎ сСтСвому ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅Π³ΠΎ нас хоста, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ netmgr_strtond(). (Π­Ρ‚ΠΎ дСйствиС ΠΏΠΎ своСй сути ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ косвСнности, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΡƒΠ·Π»Π° для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ прилоТСния являСтся Π΅Π³ΠΎ имя, Π° Π½Π΅ дСскриптор.)