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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 108

Автор Уильям БтивСнс

//sunrpc/xdr1/example.c

1  #include "unpipc.h"

2  #include "example.h"


3  int

4  main(int argc, char **argv)

5  {

6   int size;

7   example foo;

8   size = RNDUP(sizeof(foo.a)) + RNDUP(sizeof(foo.b)) +

9    RNDUP(sizeof(foo.c[0])) * MAXC;

10  printf("size = %d\n", size);

11  exit(0);

12 }

8-9 ΠœΠ°ΠΊΡ€ΠΎΡ RNDUP ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅ <rpc/xdr.h>. Он округляСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠ΅ΠΌΡƒ ΠΊΡ€Π°Ρ‚Π½ΠΎΠΌΡƒ BYTES_PER_XDR_UNIT (4). Для массива фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° вычисляСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ умноТаСтся Π½Π° количСство элСмСнтов.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π² случаС использования Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. Если ΠΌΡ‹ объявим stringd<10>, ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ RNDUP(sizeof( int)) (для Π΄Π»ΠΈΠ½Ρ‹) плюс RNDUP(sizeof(char)*10) (для символов строки). Но ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°, Ссли ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π² объявлСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, float e<>). Π›ΡƒΡ‡ΡˆΠ΅ всСго Π² этом случаС Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ с запасом, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π»ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ XDR ΠΎΡˆΠΈΠ±ΠΊΡƒ (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.5).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ способа задания Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ»Π΅ XDR, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ для всСх ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² листингС 16.17.

Листинг 16.17. Π€Π°ΠΉΠ» спСцификации XDR, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ способы задания Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

//sunrpc/xdr1/opt1.x

1  union optlong switch (bool flag) {

2  case TRUE:

3   long val;

4  case FALSE:

5   void;

6  };


7  struct args {

8   optlong arg1; /* объСдинСниС с булСвским дискриминантом */

9   long arg2<1>; /* массив ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ с ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом */

10  long *arg3; /* ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ */

11 };

ОбъявлСниС объСдинСния с булСвским дискриминантом

1-8 ΠœΡ‹ опрСдСляСм объСдинСниС с вСтвями FALSE ΠΈ TRUE ΠΈ структуру этого Ρ‚ΠΈΠΏΠ°. Если Ρ„Π»Π°Π³ дискриминанта TRUE, Π·Π° Π½ΠΈΠΌ слСдуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° long; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π·Π° Π½ΠΈΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ слСдуСт. ПослС кодирования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ XDR это объСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ:

β–  4 Π±Π°ΠΉΡ‚Π° Ρ„Π»Π°Π³Π° со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1 (TRUE) ΠΈ 4 Π±Π°ΠΉΡ‚Π° цСлочислСнного значСния Π»ΠΈΠ±ΠΎ

β–  4 Π±Π°ΠΉΡ‚Π° Ρ„Π»Π°Π³Π° со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0 (FALSE).

ОбъявлСниС массива ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹

9 Если ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ массив ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ с ΠΎΠ΄Π½ΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ элСмСнтом, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΊΠ°ΠΊ:

β–  4 Π±Π°ΠΉΡ‚Π° со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1 ΠΈ 4 Π±Π°ΠΉΡ‚Π° значСния Π»ΠΈΠ±ΠΎ

β–  4 Π±Π°ΠΉΡ‚Π° со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0.

ОбъявлСниС указатСля XDR

10 Новый способ опрСдСлСния Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² объявлСнии указатСля. Он Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ:

β–  4 Π±Π°ΠΉΡ‚Π° со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1 ΠΈ 4 Π±Π°ΠΉΡ‚Π° значСния Π»ΠΈΠ±ΠΎ

β–  4 Π±Π°ΠΉΡ‚Π° со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0

Π² зависимости ΠΎΡ‚ значСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ указатСля ΠΏΡ€ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Если ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ кодирования. Если ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ, получится Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ кодирования Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² случаС, Ссли Π² нашСм ΠΊΠΎΠ΄Π΅ имССтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° эти Π΄Π°Π½Π½Ρ‹Π΅.

ВаТная Π΄Π΅Ρ‚Π°Π»ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π΄Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TRUE Ρ€Π°Π²Π½ΠΎ 1, Ρ‡Ρ‚ΠΎ совпадаСт с Π΄Π»ΠΈΠ½ΠΎΠΉ массива ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, ΠΊΠΎΠ³Π΄Π° Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ элСмСнт.

Π’ листингС 16.18 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, созданного ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ rpcgen для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° спСцификации.

Листинг 16.18. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ листинга 16.17

//sunrpc/xdr1/opt1.h

7  struct optlong {

8   bool_t flag;

9   union {

10  long val;

11  } optlong_u;

12 };

13 typedef struct optlong optlong;


14 struct args {

15  optlong arg1;

16  struct {

17   u_int arg2_len;

18   long *arg2_val;

19  } arg2;

20  long *arg3;

21 };

22 typedef struct args args;

14-21 Π₯отя всС Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, способы присваивания ΠΈ получСния ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² языкС Π‘ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹.

Π’ листингС 16.19 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст простой ΠΏpoΠ³Ρ€aΠΌΠΌΡ‹, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ значСния всСх Ρ‚Ρ€Π΅Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ long Π½Π΅ кодируСтся.

Листинг 16.19. Ни ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ

//sunrpc/xdr1/opt1z.с

1  #include "unpipc.h"

2  #include "opt1.h"


3  int

4  main(int argc, char **argv)

5  {

6   int i;

7   XDR xhandle;

8   char *buff;

9   long *lptr;

10  args out;

11  size_t size;

12  out.arg1.flag = FALSE;

13  out.arg2.arg2_len = 0;

14  out.arg3 = NULL;

15  buff = Malloc(BUFFSIZE); /* АдрСс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚Π΅Π½ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ */

16  xdrmem_create(&xhandle, buff, BUFFSIZE, XOR_ENCODE);

17  if (xdr_args(&xhandle, &out) != TRUE)

18   err_quit("xdr_args error");

19  size = xdr_getpos(&xhandle);

20  lptr = (long*)buff;

21  for (i = 0; i < size; i += 4)

22   printf("%ld\n", (long) ntohl(*lptr++));

23  exit(0);

24 }

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

12-14 Дискриминанту объСдинСния присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FALSE, Π΄Π»ΠΈΠ½Π° массива ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ устанавливаСтся Π² 0, Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ дСлаСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ (NULL).

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

15-19 ΠœΡ‹ выдСляСм Π±ΡƒΡ„Π΅Ρ€ ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅ΠΌ структуру out Π² ΠΏΠΎΡ‚ΠΎΠΊ XDR. 

Π’Ρ‹Π²ΠΎΠ΄ содСрТимого Π±ΡƒΡ„Π΅Ρ€Π° XDR

20-22 ΠœΡ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ содСрТимоС Π±ΡƒΡ„Π΅Ρ€Π° XDR ΠΏΠΎ 4 Π±Π°ΠΉΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ntohl (host-to-network long integer) для прСобразования ΠΈΠ· порядка XDR big-endian Π² Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ порядок ΡƒΠ·Π»Π°. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΎ Π² Π±ΡƒΡ„Π΅Ρ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ XDR Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния:

solaris % opt1z

0

0

0

Как ΠΌΡ‹ ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ, ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ отводится 4 Π±Π°ΠΉΡ‚Π° со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ О, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π° Π½ΠΈΠΌ Π½Π΅ слСдуСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ….

Π’ листингС 16.20 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° измСнСнная вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая присваиваСт значСния всСм Ρ‚Ρ€Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ, ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… Π² ΠΏΠΎΡ‚ΠΎΠΊ XDR ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ содСрТимоС.

Листинг 16.20. ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΈΠ· листинга 16.17

//sunrpc/xdr1/opt1.c

1  #include "unpipc.h"

2  #include "opt1.h"


3  int

4  main(int argc, char **argv)

5  {

6   int i;

7   XOR xhandle;

8   char *buff;

9   long lval2, lval3, *lptr;

10  args out;

11  size_t size;

12  out.arg1.flag = TRUE;

13  out.arg1.optlong_u.val = 5;

14  lval2 = 9876;

15  out.arg2.arg2_len = 1;

16  out.arg2.arg2_val = &lval2;

17  lval3 = 123;

18  out.arg3 = &lval3;

19  buff = Malloc(BUFFSIZE); /* адрСс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚Π΅Π½ 4 */

20  xdrmem_create(&xhandle, buff, BUFFSIZE, XDR_ENCODE);

21  if (xdr_args(&xhandle, &out) != TRUE)

22   err_quit("xdr_args error");

23  size = xdr_getpos(&xhandle);

24  lptr = (long *) buff;

25  for (i = 0; i < size; i += 4)

26   printf("%ld\n", (long) ntohl(*lptr++));

27  exit(0);

28 }

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

12-18 Для присваивания значСния объСдинСнию ΠΌΡ‹ устанавливаСм дискриминант Π² TRUE, Π° Π·Π°Ρ‚Π΅ΠΌ присваиваСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ полю long. Π”Π»ΠΈΠ½Ρƒ массива ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ сначала устанавливаСм Π² 1. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ устанавливаСм Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² памяти.

ΠŸΡ€ΠΈ запускС этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ ΡˆΠ΅ΡΡ‚ΡŒ 4-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

solaris % opt1

1 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ дискриминанта TRUE

5

1 Π΄Π»ΠΈΠ½Π° массива ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹

9876

1 Ρ„Π»Π°Π³ для Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ указатСля

123

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° связного списка

Если осущСствима ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ возмоТности ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π² XDR ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для кодирования ΠΈ дСкодирования связных списков, содСрТащих ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство элСмСнтов. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ связный список ΠΏΠ°Ρ€ имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» спСцификации XDR ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 16.21.

Листинг 16.21. БпСцификация XDR для связного списка ΠΏΠ°Ρ€ имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

//sunrpc/xdr1/opt2.x

1 struct mylist {

2  string name<>;

3  long value;

4  mylist *next;

5 };


6 struct args {

7  mylist *list;

8 };

1-5 Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° mylist содСрТит ΠΎΠ΄Π½Ρƒ ΠΏΠ°Ρ€Ρƒ имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² послСднСй структурС списка Π±ΡƒΠ΄Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ.

Π’ листингС 16.22 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, созданного ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ rpcgen ΠΈΠ· Ρ„Π°ΠΉΠ»Π° opt2.Ρ….

Листинг 16.22. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», созданный ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ rpcgen

//sunrpc/xdr1/opt2.h

7  struct mylist {

8   char *name;

9   long value;

10  struct mylist *next;