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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 129

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

β€’ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈ устанавливаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setlocale(). Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ доступ ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π²ΠΈΠ΄Π°ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π»ΠΎΠΊΠ°Π»ΠΈ. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ локаль ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² Π»ΠΎΠΊΠ°Π»ΠΈ Β«Π‘Β», которая Π²Ρ‹Π΄Π°Π΅Ρ‚ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ для систСм Unix Π΄ΠΎ NLS Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹: 7-разрядный ASCII, английскиС названия мСсяцСв ΠΈ Π΄Π½Π΅ΠΉ ΠΈ Ρ‚.Π΄. Π›ΠΎΠΊΠ°Π»ΡŒ Β«POSIXΒ» эквивалСнтна Π»ΠΎΠΊΠ°Π»ΠΈ Β«Π‘Β».

β€’ Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ строк с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Π»ΠΎΠΊΠ°Π»ΠΈ осущСствляСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ strcoll() ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ strxfrm() ΠΈ strcmp(). ВозмоТности Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ доступ ΠΊ свСдСниям ΠΎ Π»ΠΎΠΊΠ°Π»ΠΈ (localeconv() ΠΈ nl_langinfo()), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊ спСцифичСского для Π»ΠΎΠΊΠ°Π»ΠΈ форматирования (strfmon(), strftime() ΠΈ printf()).

β€’ ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ стороной получСния относящСйся ΠΊ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ являСтся Π²Ρ‹Π²ΠΎΠ΄ сообщСний Π½Π° мСстном языкС. МодСль catgets() System V, хотя ΠΈ стандартизована POSIX, Ρ‚Ρ€ΡƒΠ΄Π½Π° для использования ΠΈ поэтому Π½Π΅ рСкомСндуСтся.[151] ВмСсто этого GNU gettext Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ замысСл Solaris.

β€’ ΠŸΡ€ΠΈ использовании gettext() ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ строка сообщСния Π½Π° английском дСйствуСт Π² качСствС ΠΊΠ»ΡŽΡ‡Π° Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ получаСтся ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки. КаТдоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ тСкстовый Π΄ΠΎΠΌΠ΅Π½ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ gettext() ΠΌΠΎΠ³Π»Π° Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ (извСстный ΠΊΠ°ΠΊ «список сообщСний»). ВСкстовый Π΄ΠΎΠΌΠ΅Π½ устанавливаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ textdomain(). ΠŸΡ€ΠΈ тСстировании ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ надобности мСстополоТСниС списка сообщСний ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bindtextdomain().

β€’ gettext() ΠΈ Π΅Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ доступ ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°ΠΌ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… тСкстовых Π΄ΠΎΠΌΠ΅Π½Π°Ρ… ΠΈΠ»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… катСгориях Π»ΠΎΠΊΠ°Π»Π΅ΠΉ. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ, функция ngettext() ΠΈ Π΅Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ мноТСствСнных чисСл, Π½Π΅ пСрСгруТая Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ полоТСния Π² спСцификаторС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° printf() Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… строк, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ порядкС, Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² строкС.

β€’ ΠΠ° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ GNU ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… строк Π² исходных Ρ„Π°ΠΉΠ»Π°Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» gettext.h ΠΈ макросы _() ΠΈ N_(). Вакая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° обСспСчиваСт ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ исходного ΠΊΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ, прСдоставляя Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя прСимущСства ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

β€’ GNU gettext прСдоставляСт многочислСнныС инструмСнты для создания ΠΈ управлСния Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² (пСрСносимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²) ΠΈ ΠΈΡ… Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ эквивалСнтами (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ сообщСний).

β€’ ΠΠ°ΠΊΠΎΠ½Π΅Ρ†, стоит Π±Ρ‹Ρ‚ΡŒ Π² курсС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠ² символов ΠΈ ΠΈΡ… прСдставлСний. ΠŸΠΎΡΡ‚Π°Π²Ρ‰ΠΈΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ большС ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ хотят Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ лишь Π½Π° ΠΎΠ΄Π½ΠΎΠΌ языкС.

УпраТнСния

1. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈ ваша систСма Π»ΠΎΠΊΠ°Π»ΠΈ? Если Π΄Π°, какая локаль ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ?

2. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ страницу locale(1), Ссли ΠΎΠ½Π° Ρƒ вас Π΅ΡΡ‚ΡŒ. Бколько имССтся Π»ΠΎΠΊΠ°Π»Π΅ΠΉ, Ссли Π²Ρ‹ посчитаСтС ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 'locale -a | wc -l'?

3. ΠŸΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ с ch13-strings.с, ch13-lconv.c, ch13-strfmon.с, ch13-quoteflag.c ΠΈ ch13-times.c Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… локалях. Какая ΠΈΠ· Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Π»ΠΎΠΊΠ°Π»Π΅ΠΉ самая «нСобычная» ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

4. Π’ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ ΠΎΠ΄Π½Ρƒ ΠΈΠ· своих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π˜Π½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΅Π΅ с использованиСм GNU gettext. ΠŸΠΎΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, ΠΊΡ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти для вас сообщСния. ΠžΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΈ протСстируйтС Π΅Π³ΠΎ, использовав bindtextdomain(). Какова Π±Ρ‹Π»Π° рСакция вашСго ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΈ Π²ΠΈΠ΄Π΅ использования ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°?

Π“Π»Π°Π²Π° 14

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ интСрфСйсы

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ нСсколько Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… API. Они сходны ΠΏΠΎ своСй ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ с описанными Ρ€Π°Π½Π΅Π΅ Π² ΠΊΠ½ΠΈΠ³Π΅ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности. НСкоторыС ΠΈΠ· Π½ΠΈΡ… Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π±Ρ‹Π»ΠΎ свободно ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±Ρ‹Π»ΠΈ освСщСны ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π΅ΠΌΡ‹.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ прСдставлСния здСсь соотвСтствуСт порядку Π³Π»Π°Π² Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ ΠΊΠ½ΠΈΠ³ΠΈ. Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Ρ‚Π΅ΠΌΡ‹ Π½Π΅ связаны Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. ΠœΡ‹ освСщаСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы: динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½ΠΎΠΉ памяти; Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»ΠΎΠ²; ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… со значСниями Π΄ΠΎΠ»Π΅ΠΉ сСкунды; ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·Π²ΠΈΡ‚Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для сохранСния ΠΈ получСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠ΅, всС API Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² стандарт POSIX.

14.1. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½ΠΎΠΉ памяти: posix_memalign() ΠΈ memalign()

Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π·Π°Π΄Π°Ρ‡ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ подходят стандартныС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ выдСлСния памяти β€” malloc(), realloc() ΠΈ Ρ‚.Π΄. Но ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π° Ρ‚Π΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ способом. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, адрСс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° являСтся ΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ числа. (НапримСр, Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… систСмах ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ памяти осущСствляСтся Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрСС, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π±ΡƒΡ„Π΅Ρ€Π°, Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π΅ слова.) Π’Π°ΠΊΡƒΡŽ слуТбу ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

#include <stdlib.h>


int posix_memalign(void **memptr, size_t alignment, size_t size);

 /* POSIX ADV */

void *memalign(size_t boundary, size_t size); /* ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ */

posix_memalign() являСтся Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ; ΠΎΠ½Π° являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Β«ΠšΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈΒ» (Β«Advisory InformationΒ»). Π Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ отличаСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ выдСлСния памяти Linux. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΎΠ½Π° Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1. ВмСсто этого Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 0 ΠΏΡ€ΠΈ успСхС ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ errno Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ. АргумСнты ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

void **memptr

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ void*. УказываСмая пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ адрСс Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° памяти. ВыдСлСнная ΠΏΠ°ΠΌΡΡ‚ΡŒ освобоТдаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ free().

size_t alignment

Π’Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅. Оно Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚Π½ΠΎ sizeof(void*) ΠΈ Π±Ρ‹Ρ‚ΡŒ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ Π΄Π²ΠΎΠΉΠΊΠΈ.

size_t size

Число выдСляСмых Π±Π°ΠΉΡ‚ΠΎΠ².

memalign() являСтся нСстандартной, Π½ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎ доступной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ сходным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ NULL Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ ΠΈ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠΌΡƒ Π±Π»ΠΎΠΊΡƒ памяти ΠΏΡ€ΠΈ успСхС, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ boundary (ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π΄Π²ΠΎΠΉΠΊΠΈ) ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅, a size β€” Π·Π°Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти.

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ выдСлСнная memalign() ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ ΠΌΠΎΠ³Π»Π° Π±Ρ‹Ρ‚ΡŒ освобоТдСна с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ free(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ memalign() использовала для выдСлСния памяти malloc() ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹ΠΉ подходящим ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π±Π°ΠΉΡ‚ Π³Π΄Π΅-Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ°. ВСрсия GLIBC Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Из этих Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ posix_memalign(), Ссли ΠΎΠ½Π° Ρƒ вас Π΅ΡΡ‚ΡŒ.

14.2. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ²

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ систСмы Unix, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ GNU/Linux, Π΄Π°ΡŽΡ‚ Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ вСсь Ρ„Π°ΠΉΠ» для чтСния ΠΈΠ»ΠΈ записи. Подобно ΠΌΠ½ΠΎΠ³ΠΈΠΌ частям Unix API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ послС V7, имССтся нСсколько нСсовмСстимых способов ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»ΠΎΠ². Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» рассматриваСт эти возмоТности.

14.2.1. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²

Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ Π·Π°ΠΌΠΎΠΊ Π½Π° вашСй Π΄Π²Π΅Ρ€ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ проникновСния Π² ваш Π΄ΠΎΠΌ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π° ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π² Ρ„Π°ΠΉΠ»Π΅. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² Unix послС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ V7 (ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ происходят всС соврСмСнныС систСмы Unix), ΠΈ соотвСтствСнно Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… систСмах Unix Π±Ρ‹Π»ΠΈ доступны ΠΈ использовались нСсколько нСсовмСстимых ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ². Как Π² BSD Unix, Ρ‚Π°ΠΊ ΠΈ Π² System V Π±Ρ‹Π»ΠΈ собствСнныС Π½Π΅ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π²Ρ‹Π·ΠΎΠ²Ρ‹ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС POSIX Ρ„ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π» способ осущСствлСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² System V. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, названия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² System V ΠΈ BSD Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ GNU/Linux, Π² ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡƒΠ³ΠΎΠ΄ΠΈΡ‚ΡŒ всСм, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±Π΅ разновидности Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.

Π’Π°Π±Π». 14.1 суммируСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.


Π’Π°Π±Π»ΠΈΡ†Π° 14.1. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ Ѐункция Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π’Π΅ΡΡŒ Ρ„Π°ΠΉΠ» Π§Ρ‚Π΅Π½ΠΈΠ΅/запись Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ BSD flock() √ √ √ POSIX fcntl() √ √ √ √ √ POSIX lockf() √ √ √ √ √

Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ аспСкты Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²: