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

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

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

Β unsigned flags, void* handle) {

Β char Buffer[MESSIZE_MAX];

Β printf("ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ΅ сообщСниС Ρ‚ΠΈΠΏ %x ΠΎΡ‚"

Β  " \"%s\"\n", code, IdLabelParse(code));

Β printf("Π’ΠΎΡ‚ это сообщСниС <<%s>>\n",

Β  (char *)(ctp->msg) + 4);

Β strcpy(Buffer, "ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρƒ: Π΄Π°, я Ρ‚Π°ΠΊΠΎΠΉ");

Β MsgReply(ctp->rcvid, EOK, Buffer, sizeof(Buffer));

Β return(0);

}

/********************************************************************

Ѐункция ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅

имя процСсса ΠΏΠΎ Π΅Π³ΠΎ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠ΅

********************************************************************/

char* IdLabelParse(int id) {

Β struct IdLabel_t Inventory;

Β int i = 0;

Β while (IdLabel[i].id != id && i < ALLNUM_MYPROC) i++;

Β if (i == ALLNUM_MYPROC) return Anonymous;

Β else return(IdLabel[i].name);

}

ИспользованиС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° слуТбы Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½

Начиная с QNX вСрсии 6.3 сСрвис Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½, обСспСчиваСмый GNS-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ слуТбы (ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ

gns
), дСйствуСт Π² сСти. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот сСрвис, Π½Π΅Ρ‚ нСобходимости ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурсов, ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ свою слуТбу, Π° прилоТСния-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Ρ‹ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ слуТбы Ρ‡Π΅Ρ€Π΅Π· QNET-ΡΠ΅Ρ‚ΡŒ Π±Π΅Π· знания Ρ‚Π°ΠΊΠΈΡ… частностСй, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Π΄Π΅ эта слуТба располагаСтся ΠΈ ΠΊΡ‚ΠΎ Π΅Π΅ обСспСчиваСт. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ сСрвисС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ см. Π² [4].

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

gns
.

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ ΡƒΠ·Π΅Π»:

# gns -s

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π» (ΡƒΠ·Π»Ρ‹):

# gns -с

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π° ΡƒΠ·Π»Π°Ρ…, Π³Π΄Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ слуТбы Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½, появятся ΠΈΠΌΠ΅Π½Π°

/dev/name/global
ΠΈ
/dev/name/local
. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π», Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ gns-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ сСрвСр, Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ сСти ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π²ΠΈΠ΄ пространства ΠΈΠΌΠ΅Π½ Π½Π°
/dev/name/global
. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» ΠΈΠΌΠ΅Π΅Ρ‚ локальноС пространство ΠΈΠΌΠ΅Π½
/dev/name/local
, ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для Π΄Π°Π½Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ ΠΎΡ‚ локального пространства ΠΈΠΌΠ΅Π½ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ машинС. (ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΈΠΌΠ΅Π½
global
ΠΈ
local
ΠΏΠΎΠ΄
/dev/name/
появится Π΅Ρ‰Π΅ имя
gns_server
ΠΈΠ»ΠΈ
gns_local
β€” имя, ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ рСгистрируСтся сам GNS-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€.)

БущСствуСт нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ API, относящихся ΠΊ слуТбС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½:

name_attach()
,
name_open()
ΠΈ
name_close()
. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹, Π·Π½Π°ΠΊΠΎΠΌΡ‹Π΅ с QNX 4, сразу Β«ΡƒΠ·Π½Π°ΡŽΡ‚Β» Π² Π½ΠΈΡ… Π°Π½Π°Π»ΠΎΠ³ΠΈ извСстных ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
qnx_name_attach()
,
qnx_name_open()
ΠΈ
qnx_name_close()
. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для объявлСния ΠΈΠΌΠ΅Π½ΠΈ слуТбы, связи со слуТбой ΠΈ отсоСдинСния ΠΎΡ‚ слуТбы.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ своС имя глобально Π² сСти, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-сСрвСр Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π° ΡƒΠ·Π»Π΅, Π³Π΄Π΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ сСрвСра Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ слуТбы Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½, ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ свою слуТбу, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π²Ρ‹Π·ΠΎΠ²:

if (!(NameServer = name_attach(NULL, "MyService", NAME_FLAG_ATTACH_GLOBAL)))

Β return EXIT_FAILURE;

Π€Π»Π°Π³

NAME_FLAG_ATTACH_GLOBAL
ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-сСрвСр ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ своС имя глобально β€” Π² сСти. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ слуТбу глобально, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΎ доступа
root
. ПослС выполнСния этого Π²Ρ‹Π·ΠΎΠ²Π° Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ
/dev/name/global
появится подсоСдинСнноС имя
MyService
(Ссли Π±Ρ‹ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° Π±Ρ‹Π» установлСн Π² ноль, это имя оказалось Π±Ρ‹ подсоСдинСнным ΠΊ
/dev/name/local
ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ локально).

РСгистрируя имя Π² пространствС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½, функция

name_attach()
создаСт ΠΊΠ°Π½Π°Π», ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² составС структуры
NameServer
. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ этот ΠΊΠ°Π½Π°Π» создаСтся с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ установлСнными Ρ„Π»Π°Π³Π°ΠΌΠΈ, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΌΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия систСмС:

β€’Β 

_NTO_CHF_UNBLOCK
β€” Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ ΠΊΠ°Π½Π°Π»Π° ΠΈΠΌΠΏΡƒΠ»ΡŒΡ с ΠΊΠΎΠ΄ΠΎΠΌ
_PULSE_CODE_UNBLOCK
ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ
rcvid
ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Reply-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ попытаСтся Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ (скаТСм, ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ сигнала ΠΈΠ»ΠΈ ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ);

β€’Β 

_NTO_CHF_DISCONNECT
β€” Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ ΠΊΠ°Π½Π°Π»Π° ΠΈΠΌΠΏΡƒΠ»ΡŒΡ с ΠΊΠΎΠ΄ΠΎΠΌ
_PULSE_CODE_DISCONNECT
, ΠΊΠΎΠ³Π΄Π° ΠΎΡ‚ процСсса ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ»ΠΈΡΡŒ всС установлСнныС соСдинСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»
name_close()
Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ свой
name_open()
ΠΊ ΠΈΠΌΠ΅Π½ΠΈ сСрвСра Π»ΠΈΠ±ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡƒΠΌΠ΅Ρ€);

β€’Β 

_NTO_CHF_COID_DISCONNECT
β€” Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ ΠΊΠ°Π½Π°Π»Π° ΠΈΠΌΠΏΡƒΠ»ΡŒΡ с ΠΊΠΎΠ΄ΠΎΠΌ
_PULSE_CODE_COIDDEATH
ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ
coid
(ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° соСдинСния) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ соСдинСния ΠΏΠΎ этому ΠΊΠ°Π½Π°Π»Ρƒ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°Π½Π°Π» закрываСтся.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, послС создания ΠΊΠ°Π½Π°Π»Π°, сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌ сообщСний ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²:

rcvid = MsgReceive(NameServer->chid, &MsgBuf, sizeof MsgBuf);

Однако ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΡˆΠ»Π΅Ρ‚ Π½Π΅ нСпосрСдствСнноС сообщСниС для сСрвСра, Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚, скаТСм, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ, ΠΏΠΎ сути, Ρ‚ΠΎΠΆΠ΅ являСтся отосланным сообщСниСм. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСний Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡ… Β«Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽΒ»:

if (MsgBuf.hdr_type >= _IO_BASE && Buffer.hdr.type <= _IO_MAX) {