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

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

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

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

64-разрядноС Ρ†Π΅Π»ΠΎΠ΅ поддСрТиваСтся ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ компиляторами Π‘ ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ long long int ΠΈΠ»ΠΈ просто long long. МногиС, Π½ΠΎ Π½Π΅ всС компиляторы ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² созданном Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° longlong_t, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:

typedef long long longlong_t;

Π”Π»ΠΈΠ½Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ Π² XDR Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 32 Π±ΠΈΡ‚Π°, Π½ΠΎ Π΄Π»ΠΈΠ½Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ языка Π‘ Π² 64-разрядных систСмах Unix ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈ 64 Π±ΠΈΡ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ LP64, описанной Π² [24, с. 27]). ИмСна Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° XDR устарСли Π»Π΅Ρ‚ Π½Π° Π΄Π΅ΡΡΡ‚ΡŒ ΠΈ Π½Π΅ слишком ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ соврСмСнным стандартам. Π›ΡƒΡ‡ΡˆΠ΅, Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π½Π°Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²Ρ€ΠΎΠ΄Π΅ int8_t, int16_t ΠΈ Ρ‚. Π΄.

4. ΠŸΡΡ‚ΡŒ Ρ†Π΅Π»Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π±Π΅Π· Π·Π½Π°ΠΊΠ°. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ 4 ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ 32-разрядныС значСния, Π° послСднСС β€” ΠΊΠ°ΠΊ 64-разрядноС.

5. Π’Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ пСрСдаСтся ΠΊΠ°ΠΊ 32-разрядноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” ΠΊΠ°ΠΊ 64-разрядноС, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ β€” ΠΊΠ°ΠΊ 128-разрядноС.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

ЧСтвСрная Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ для чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (quadruple precision) поддСрТиваСтся Π² Π‘ для Ρ‚ΠΈΠΏΠΎΠ² long double. He всС компиляторы ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы Π΅Π³ΠΎ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚. Π’Π°Ρˆ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ long double, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΊ с double. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² созданном Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° quadruple, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с объявлСниСм

typedef long double quadruple;

Π’ Solaris 2.6, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ строку

%#include <floatingpoint.h>

Π² Π½Π°Ρ‡Π°Π»ΠΎ Ρ„Π°ΠΉΠ»Π° спСцификации RPC, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ этот Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» содСрТит Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π—Π½Π°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π΄ #include Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ rpcgen ΠΎ нСобходимости ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ остаток строки нСпосрСдствСнно Π² создаваСмый Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

6. Π’ΠΈΠΏ boolean эквивалСнтСн Ρ†Π΅Π»ΠΎΠΌΡƒ со Π·Π½Π°ΠΊΠΎΠΌ. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ RPC Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ константу TRUE Ρ€Π°Π²Π½ΠΎΠΉ 1, a FALSE Ρ€Π°Π²Π½ΠΎΠΉ 0.

7. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ (enumeration) эквивалСнтно Ρ†Π΅Π»ΠΎΠΌΡƒ со Π·Π½Π°ΠΊΠΎΠΌ ΠΈ совпадаСт с Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… enum Π² Π‘. rpcgen Ρ‚Π°ΠΊΠΆΠ΅ создаСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° для Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

8. Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ фиксированной Π΄Π»ΠΈΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ ΠΊΠ°ΠΊ 8-разрядныС значСния Π±Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ.

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

10. Π‘Ρ‚Ρ€ΠΎΠΊΠ° прСдставляСт собой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ASCII-символов. Π’ памяти строка хранится ΠΊΠ°ΠΊ обычная строка символов языка Π‘, Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌΠ°Ρ Π½ΡƒΠ»Π΅ΠΌ, Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π΅ΠΉ отправляСтся Ρ†Π΅Π»ΠΎΠ΅ Π±Π΅Π· Π·Π½Π°ΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ помСщаСтся количСство символов Π΄Π°Π½Π½ΠΎΠΉ строки (Π±Π΅Π· Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ нуля). ΠŸΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ€Π°Π·ΠΌΠ΅Ρ€ строки опрСдСляСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° strlen. ΠŸΡ€ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² строку символов Π‘, Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌΡƒΡŽ Π½ΡƒΠ»Π΅ΠΌ.

11. ΠœΠ°ΡΡΠΈΠ² фиксированной Π΄Π»ΠΈΠ½Ρ‹ любого Ρ‚ΠΈΠΏΠ° пСрСдаСтся ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ n элСмСнтов Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

12. ΠœΠ°ΡΡΠΈΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ любого Ρ‚ΠΈΠΏΠ° пСрСдаСтся ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ Π±Π΅Π· Π·Π½Π°ΠΊΠ°, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ количСство элСмСнтов, ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ элСмСнтов Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. МаксимальноС количСство элСмСнтов Π² объявлСнии ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ. Но Ссли это количСство ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Π½Π΅ прСвосходит Π»ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½Π°Ρ Π΄Π»ΠΈΠ½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ значСния m.

13. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° пСрСдаСтся ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ΠΉ. rpcgen Ρ‚Π°ΠΊΠΆΠ΅ создаСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (typedef).

14. Π Π°Π·ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ΅ объСдинСниС состоит ΠΈΠ· цСлочислСнного дискриминанта ΠΈ Π½Π°Π±ΠΎΡ€Π° Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… (Π²Π΅Ρ‚Π²Π΅ΠΉ), зависящих ΠΎΡ‚ значСния дискриминанта. Π’ Ρ‚Π°Π±Π». 16.2 ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ дискриминант Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ° int, Π½ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ unsigned int, ΠΈ enum, ΠΈ bool (всС эти Ρ‚ΠΈΠΏΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ 32-разрядныС Ρ†Π΅Π»Ρ‹Π΅). ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ объСдинСния пСрСдаСтся 32-разрядноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ дискриминанта, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΉ Π²Π΅Ρ‚Π²ΠΈ, которая Π΅ΠΌΡƒ соотвСтствуСт. Π’ Π²Π΅Ρ‚Π²ΠΈ default часто ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Ρ‚ΠΈΠΏ void, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ отсутствиС ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ вслСд Π·Π° дискриминантом ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. НиТС ΠΌΡ‹ продСмонстрируСм это Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

15. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ объСдинСния, описанный Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ· листинга 16.24. ОбъявлСниС XDR выглядит ΠΊΠ°ΠΊ объявлСниС указатСля Π² языкС Π‘, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π² созданном Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

На рис. 16.3 свСдСна информация ΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² XDR.

Рис. 16.3. ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² XDR

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: использованиС XDR Π±Π΅Π· RPC

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования XDR Π±Π΅Π· RPC. ΠœΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ стандартом XDR для кодирования структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² машинно-нСзависимоС прСдставлСниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ систСмами. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для написания Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти Π² машинно-нСзависимом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅. Π’ листингС 16.11 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„Π°ΠΉΠ»Π° спСцификации data .Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° самом Π΄Π΅Π»Π΅ являСтся Ρ„Π°ΠΉΠ»ΠΎΠΌ спСцификации XDR, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ объявляСм Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ RPC.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Буффикс ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° (.Ρ…) происходит ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° Β«Ρ„Π°ΠΉΠ» спСцификации XDRΒ». БпСцификация RPC ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ язык RPC (RPCL) ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ XDR Π² части, относящСйся ΠΊ описанию Π΄Π°Π½Π½Ρ‹Ρ…. Π’ RPCL Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ описания ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€.

Листинг 16.11. Π€Π°ΠΉΠ» спСцификации XDR

//sunrpc/xdr1/data.x

1  enum result_t {

2   RESULT_INT = 1, RESULT_DOUBLE = 2

3  };


4  union union_arg switch (result_t result) {

5  case RESULT_INT:

6   int intval;

7  case RESULT_DOUBLE:

8   double doubleval;

9  default:

10  void;

11 };


12 struct data {

13  short short_arg;

14  long long_arg;

15  string vstring_arg<128>; /* строка ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ */

16  opaque fopaque_arg[3]; /* скрытыС Π΄Π°Π½Π½Ρ‹Π΅ фиксированной Π΄Π»ΠΈΠ½Ρ‹ */

17  opaque vopaque_arg<>; /* скрытыС Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ */

18  short fshort_arg[4]; /* массив фиксированной Π΄Π»ΠΈΠ½Ρ‹ */

19  long vlong_arg<>; /* массив ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ */

20  union_arg uarg;

21 };

ОбъявлСниС пСрСчислСния ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ объСдинСния

1-11 ΠœΡ‹ объявляСм пСрСчислимый Ρ‚ΠΈΠΏ с двумя значСниями ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ΅ объСдинСниС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ это пСрСчислСниС Π² качСствС дискриминанта. Если дискриминант ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ RESULT_INT, послС значСния дискриминанта пСрСдаСтся Ρ†Π΅Π»ΠΎΠ΅ число. Если дискриминант ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ RESULT_DOUBLE, Π·Π° Π½ΠΈΠΌ пСрСдаСтся число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС послС дискриминанта Π½Π΅ пСрСдаСтся Π½ΠΈΡ‡Π΅Π³ΠΎ. 

ОбъявлСниС структуры

12-21 ΠœΡ‹ объявляСм структуру, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… XDR.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ объявляСм ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ RPC, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° rpcgen Π½Π΅ создаст Π·Π°Π³Π»ΡƒΡˆΠΊΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ Π·Π°Π³Π»ΡƒΡˆΠΊΡƒ сСрвСра. Однако ΠΎΠ½Π° создаст Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» data.h ΠΈ Ρ„Π°ΠΉΠ» data_xdr.с, содСрТащий Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ XDR, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ»Π΅ data.Ρ….

Π’ листингС 16.12 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ rpcgen Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» data.h. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ этого Ρ„Π°ΠΉΠ»Π° выглядит Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ (Ρ‚Π°Π±Π». 16.2).

Листинг 16.12. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» data.h, созданный rpcgen ΠΈΠ· Ρ„Π°ΠΉΠ»Π° data.x

//sunrpc/xdr1/data.h

1  /*

2   * Please do not edit this file. It was generated using rpcgen.

3   */

4  #ifndef _DATA_H_RPCGEN

5  #define _DATA_H_RPCGEN


6  #include <rpc/rpc.h>


7  enum result_t {

8   RESULT_INT = 1,

9   RESULT_DOUBLE = 2

10 };

11 typedef enum result_t result_t;


12 struct union_arg {

13  result_t result;

14  union {

15   int intVal;

16   double doubleval;

17  } union_arg_u;

18 };

19 typedef struct union_arg union_arg;


20 struct data {

21  short short_arg;

22  long long_arg;

23  char *vstring_arg;

24  char fopaque_arg[3];

25  struct {

26   u_int vopaque_arg_len;

27   char *vopaque_arg_val;

28  } vopaque_arg;

29  short fshort_arg[4];

30  struct {

31   u_int vlong_arg_len;

32   long *vlong_arg_val;

33  } vlong_arg;

34  union_arg uarg;

35 };

36 typedef struct data data:


37 /* 4the xdr functions */

38 extern bool_t xdr_result_t(XDR *, result_t*);

39 extern bool_t xdr_union_arg(XDR *, union_arg*);

40 extern bool_t xdr_data(XDR *, data*);


41 #endif /* !_DATA_H_RPCGEN */

Π’ Ρ„Π°ΠΉΠ»Π΅ data_xdr.с ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ функция xdr_data, вызываСмая для кодирования ΠΈ дСкодирования структуры data, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ. Буффикс ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ _data соотвСтствуСт ΠΈΠΌΠ΅Π½ΠΈ нашСй структуры ΠΈΠ· листинга 16.11. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ напишСм, Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ write.с. Она Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ значСния полям структуры data, Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ xdr_data для кодирования всСх ΠΏΠΎΠ»Π΅ΠΉ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ XDR ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°.