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

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

Автор Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ ОлСг Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡

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

Β 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 ΠΈΠ»ΠΈ,