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

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

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

 if (odd) {

  struct sched_param param;

  sched_getparam(0, &param);

  static char rbuf[4];

  sprintf(rbuf, "%d\n", param.sched_curpriority);

  MsgReply(ctp->rcvid, strlen(rbuf) + 1, rbuf, strlen(rbuf) + 1);

 } else MsgReply(ctp->rcvid, EOK, NULL, 0);

 odd = !odd;

 return _RESMGR_NOREPLY;

}


// главная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запуска ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°

main(int argc, char **argv) {

 resmgr_attr_t resmgr_attr;

 dispatch_t *dpp;

 dispatch_context_t *ctp;

 int id;

 // инициализация интСрфСйса диспСтчСризации

 if ((dpp = dispatch_create()) == NULL)

  perror("allocate dispatch"), exit(EXIT_FAILURE);

 // инициализация Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°

 memset(&resmgr_attr, 0, sizeof resmgr_attr);

 resmgr_attr.nparts_max = 1;

 resmgr_attr.msg_max_size = 2048;

 // инициализация Ρ‚Π°Π±Π»ΠΈΡ† Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

 static resmgr_connect_funcs_t connect_funcs;

 static resmgr_io_funcs_t io_funcs;

 iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,

  _RESMGR_IO_NFUNCS, &io_funcs);

 // здСсь Π½Π°ΠΌΠΈ дописан всСго ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ - ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ read,

 // всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ дСлаСтся ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ!

 io_funcs.read = prior_read;

 // инициализация Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ структуры, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ

 // устройством.

 static iofunc_attr_t attr;

 iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);

 // здСсь создаСтся ΠΏΡƒΡ‚Π΅Π²ΠΎΠ΅ имя для ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°

 id = resmgr_attach(dpp, &resmgr_attr, "/dev/prior",

  _FTYPE_ANY, 0, &connect_funcs, &io_funcs, &attr);

 if (id == -1)

  perror("attach name"), exit(EXIT_FAILURE);

 ctp = dispatch_context_alloc(dpp);

 // старт ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠ°ΠΊ бСсконСчный Ρ†ΠΈΠΊΠ» оТидания

 // ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… сообщСний для диспСтчСризации:

 while (true) {

  if ((ctp = dispatch_block(ctp)) == NULL)

   perror("block error"), exit(EXIT_FAILURE);

  dispatch_handler(ctp);

 }

}

Π—Π΄Π΅ΡΡŒ использован ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ шаблон написания ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°. ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ read() (Ρ‚.e. ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ нСстандартно; Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ ΠΊΠΎΠ΄Π΅ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ open(), ΠΎΠ½ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ). По ΠΊΠΎΠΌΠ°Π½Π΄Π΅ read() ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€: Π°) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² Π²ΠΈΠ΄Π΅ тСкстовой строки, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΉΡΡ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ строки, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ (ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² QNX ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ Β«ΠΏΠ»Π°Π²Π°ΡŽΡ‚Β»?), Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ запрос, ΠΈ Π±) Π΄Π΅Π»Π°Π΅Ρ‚ это Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄ΠΈΠ½ запрос, Π² ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Ρ€Π°Π·Ρ‹ создавая Π½Π° всякий случай (ΠΏΠΎΡ‡Π΅ΠΌΡƒ Β«Π½Π° всякий», сСйчас станСт понятно) ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ EOF (ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°). Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ нСсколько ΠΊΠΎΠΌΠ°Π½Π΄:

# prior &

# ls -l /dev/pr*

nrw-rw-rw- 1 root root 0 Dec 18 17:13 /dev/prior

ВсС соотвСтствуСт нашим оТиданиям: ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурса Π·Π°ΠΏΡƒΡ‰Π΅Π½, ΠΎΠ½ зарСгистрировал Π² пространствС ΠΈΠΌΠ΅Π½ своС имя /dev/prior, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊ Π½Π΅ΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ обращСния ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ... «устройству». Для этого ΠΌΡ‹ ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ станСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ наш созданный сСрвис, Π° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ самыми заурядными ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ UNIX, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°ΡŽΡ‚ ΠΎ сущСствовании Π½ΠΎΠ²ΠΎΠ³ΠΎ сСрвиса:

# cat /dev/prior

10

# nice -n-5 cat /dev/prior

15

# nice -n-19 cat /dev/prior

29

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ спСцифичного устройства, пСрСмСщаСтся ΠΈΠ· области ΡˆΠ°ΠΌΠ°Π½ΡΡ‚Π²Π° «систСмного программиста» Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ программиста, Π΄Π° ΠΈ выполняСтся ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ высокоуровнСвыми ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ срСдствами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π‘++.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠŸΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ случаСм, ΠΈΠΌΠ΅Π½Π½ΠΎ здСсь умСстно Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ созданного ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурсов ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ микроядСрной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурса, Π° Π·Π°ΠΎΠ΄Π½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ наслСдованиС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² (критичСски Π²Π°ΠΆΠ½ΠΎΠ΅ свойство для систСм Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ) сохраняСтся ΠΏΡ€ΠΈ запросС ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ рСсурса, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌΡƒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΡƒΠ·Π»Π΅ сСти (имя ΡƒΠ·Π»Π° β€” rtp):

# on -frtp prior &

# ls -l /net/rtp/dev/pr*

nrw-rw--rw- 1 root root 0 Dec 18 17.09 /net/rtp/dev/prior

# nice -n-5 cat /net/rtp/dev/prior

15

# nice -n-19 cat /net/rtp/dev/prior

29

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом развития Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурсов являСтся ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€. ЀактичСски это объСдинСниС Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурсов с динамичСским ΠΏΡƒΠ»ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², рассмотрСнным Π²Ρ‹ΡˆΠ΅.

Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ с ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π΅ΠΌΡƒ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ обсуТдСниСм приводился Π½Π°ΠΌΠΈ Π² ΠΊΠ½ΠΈΠ³Π΅ [4] Π² Π³Π»Π°Π²Π΅ Β«Π”Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹Β». ΠœΡ‹ Π½Π΅ станСм ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ здСсь этот достаточно ΠΎΠ±ΡŠΠ΅ΠΌΠ½Ρ‹ΠΉ тСкст, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ отличаСтся ΠΎΡ‚ Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСсколькими строками послС Π²ΠΎΡ‚ этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° рСгистрации прСфикса ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°:

// здСсь создаСтся ΠΏΡƒΡ‚Π΅Π²ΠΎΠ΅ имя для ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°

id = resmgr_attach(dpp, &resmgr_attr, "/dev/prior",

 _FTYPE_ANY, 0, &connect_funcs, &io_funcs, &attr);

if (id == -1)

 perror("attach name"), exit(EXIT_FAILURE);

Π’ΠΎΡ‚ Ρ‚Π΅ нСсколько строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, собствСнно, ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ:

...

thread_pool_attr_t pool_attr;

memset(&pool_attr, 0, sizeof pool_attr);

pool_attr.handle = dpp;

// это всСгда остаСтся Ρ‚Π°ΠΊ ...:

pool_attr.context_alloc = dispatch_context_alloc;

pool_attr.block_func = dispatch_block;

pool_attr.handler_func = dispatch_handler;

pool_attr.context_free = dispatch_context_free;

// числСнныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡƒΠ»Π°:

pool_attr.lo_water = 2;

pool_attr.hi_water = 6;

pool_attr.increment = 1;

pool_attr.maximum = 50;

thread_pool_t *tpp;

// Ρ„Π»Π°Π³ создания ΠΏΡƒΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния:

// POOL_FLAG_EXIT_SELF, POOL_FLAG_USE_SELF ΠΈΠ»ΠΈ,

// Π½Π°ΠΊΠΎΠ½Π΅Ρ†, 0 ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚

// ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ дальшС с Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ...

if ((tpp = thread_pool_create(&pool_attr, POOL_FLAG_EXIT_SELF)) == NULL)

 perror("create pool"), exit(EXIT_FAILURE);

thread_pool_start(tpp);

...

}

Но всю эту ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈ описании динамичСского ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ спСцифичСского ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ созданию ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурса ΠΎΠ½Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚.

Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠΌΠΈ элСмСнтарными манипуляциями ΠΌΡ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурса (практичСски любой ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€!) Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, простота трансформации ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ подсказываСт простоС ΠΈ эффСктивноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: Π²Π½Π°Ρ‡Π°Π»Π΅ всСгда ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΎΠ΄Π½ΠΎ- ΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ ΠΎΠ½ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΈ нСобходимости трансформируйтС Π΅Π³ΠΎ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹

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

Π‘ΡƒΡ‚ΡŒ вопроса Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ. ΠŸΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурсов ΠΊΠ°ΠΊ систСмный Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ спСцифичСского Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ устройства β€” это ΡƒΠ΄Π΅Π» Π΅Π΄ΠΈΠ½ΠΈΡ† (Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ устройство β€” ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ! β€¦ ΡˆΡƒΡ‚ΠΊΠ°), Π½ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурсов β€” это прСкрасная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° для описания чисто ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… «псСвдоустройств». НапримСр, это ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ нСкоторая оконная GUI-подсистСма, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ open() создаСт прорисовку ΠΎΠΊΠ½Π° Π½Π° экранС, write() вписываСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ тСкст Π² ΠΎΠΊΠ½ΠΎ, a read() считываСт ΠΈΠ· ΠΎΠΊΠ½Π° тСкст, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ (подобная конструкция ΠΎΠΏΠΈΡΡ‹Π²Π°Π»Π°ΡΡŒ Π½Π°ΠΌΠΈ Π² Π³Π»Π°Π²Π΅ Β«Π”Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹Β» [4]). Π’Π°ΠΊΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΡ‹ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ΄Π°Π΅ΠΌ POSIX-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ своим ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ подсистСмам.

Однако для «истинных Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ²Β» запросы open() β€” read() β€” write(): Π΄ΠΎΠ»ΠΆΠ½Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ (ΠΏΡ€Π°Π²ΠΎ, бСссмыслСнно ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²)… Π­Ρ‚ΠΎ обусловливаСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурса выходят Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ экзСмпляр оборудования, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ физичСски ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΌΡƒ запрос.