Page MenuHomeFreeBSD

D55582.diff
No OneTemporary

D55582.diff

diff --git a/documentation/content/ru/books/developers-handbook/book.po b/documentation/content/ru/books/developers-handbook/book.po
--- a/documentation/content/ru/books/developers-handbook/book.po
+++ b/documentation/content/ru/books/developers-handbook/book.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
-"POT-Creation-Date: 2025-11-12 21:00+0300\n"
+"POT-Creation-Date: 2026-03-15 14:15+0300\n"
"PO-Revision-Date: 2025-07-05 04:45+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
diff --git a/documentation/content/ru/books/developers-handbook/introduction/_index.po b/documentation/content/ru/books/developers-handbook/introduction/_index.po
--- a/documentation/content/ru/books/developers-handbook/introduction/_index.po
+++ b/documentation/content/ru/books/developers-handbook/introduction/_index.po
@@ -1,12 +1,12 @@
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
-# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-05-01 19:56-0300\n"
-"PO-Revision-Date: 2025-07-06 04:45+0000\n"
+"PO-Revision-Date: 2026-03-08 09:11+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbookintroduction_index/ru/>\n"
diff --git a/documentation/content/ru/books/developers-handbook/ipv6/_index.adoc b/documentation/content/ru/books/developers-handbook/ipv6/_index.adoc
--- a/documentation/content/ru/books/developers-handbook/ipv6/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/ipv6/_index.adoc
@@ -76,7 +76,7 @@
** IPv4-совместимый адрес не поддерживается.
** автоматическое туннелирование (описано в разделе 4.3 данного RFC) не поддерживается.
-** man:gif[4] интерфейс реализует IPv[46]-поверх-IPv[46] туннель в общем виде и включает "настроенный туннель", описанный в спецификации. Подробности см. в crossref:ipv6[gif,Универсальный Туннельный Интерфейс] этого документа.
+** Интерфейс man:gif[4] реализует IPv[46]-поверх-IPv[46] туннель в общем виде и включает "настроенный туннель", описанный в спецификации. За подробностями обратитесь к разделу crossref:ipv6[gif,Универсальный туннельный интерфейс] этого документа.
* RFC1981: Path MTU Discovery for IPv6
* RFC2080: RIPng for IPv6
@@ -142,8 +142,8 @@
* RFC2710: Multicast Listener Discovery for IPv6
* RFC2711: IPv6 router alert option
* [.filename]#draft-ietf-ipngwg-router-renum-08#: Перенумерация маршрутизаторов для IPv6
-* [.filename]#draft-ietf-ipngwg-icmp-namelookups-02#: Поиск имен через ICMP в IPv6
-* [.filename]#draft-ietf-ipngwg-icmp-name-lookups-03#: Поиск имен IPv6 через ICMP
+* [.filename]#draft-ietf-ipngwg-icmp-namelookups-02#: Поиск имён через ICMP в IPv6
+* [.filename]#draft-ietf-ipngwg-icmp-name-lookups-03#: Поиск имён IPv6 через ICMP
* [.filename]#draft-ietf-pim-ipv6-01.txt#: PIM for IPv6
** man:pim6dd[8] реализует плотный режим. man:pim6sd[8] реализует разреженный режим.
@@ -261,7 +261,7 @@
См. раздел crossref:ipv6[neighbor-discovery,Функция "Обнаружение соседей"] в этом документе для информации о взаимосвязи между DAD и автонастройкой.
[[gif]]
-==== Универсальный Туннельный Интерфейс
+==== Универсальный туннельный интерфейс
GIF (Generic InterFace) — это псевдоинтерфейс для настроенного туннеля. Подробности описаны в man:gif[4]. В настоящее время
@@ -272,7 +272,7 @@
доступны. Используйте man:gifconfig[8] для назначения физических (внешних) исходных и конечных адресов интерфейсам gif. Конфигурация, использующая одно семейство адресов для внутреннего и внешнего IP-заголовка (v4 в v4 или v6 в v6), является опасной. Очень легко настроить интерфейсы и таблицы маршрутизации для выполнения бесконечного уровня туннелирования. _Пожалуйста, будьте осторожны_.
-gif можно настроить так, чтобы он был дружественным к ECN. Подробнее о дружелюбности к ECN для туннелей см. crossref:ipv6[ipsec-ecn,Учет ECN в IPsec-туннелях], а о настройке — в man:gif[4].
+gif можно настроить так, чтобы он был дружественным к ECN. Подробнее о дружелюбности к ECN для туннелей см. crossref:ipv6[ipsec-ecn,Учёт ECN в IPsec-туннелях], а о настройке — в man:gif[4].
Если вы хотите настроить туннель IPv4-в-IPv6 с интерфейсом gif, внимательно прочитайте man:gif[4]. Вам потребуется удалить линк-локальный адрес IPv6, автоматически назначенный интерфейсу gif.
@@ -291,7 +291,7 @@
Например, ::1 выбирается для ff01::1, fe80:1::200:f8ff:fe01:6317 для fe80:1::2a0:24ff:feab:839b (обратите внимание, что встроенный индекс интерфейса — описанный в crossref:ipv6[ipv6-scope-index,Индекс зоны] — помогает нам выбрать правильный исходный адрес. Эти встроенные индексы не будут передаваться по сети). Если исходящий интерфейс имеет несколько адресов для данной зоны, исходный адрес выбирается на основе наибольшего соответствия (правило 3). Предположим, что 2001:0DB8:808:1:200:f8ff:fe01:6317 и 2001:0DB8:9:124:200:f8ff:fe01:6317 назначены исходящему интерфейсу. 2001:0DB8:808:1:200:f8ff:fe01:6317 выбирается в качестве исходящего адреса для адреса назначения 2001:0DB8:800::1.
-Обратите внимание, что приведенное выше правило не документировано в спецификации IPv6. Оно считается элементом, оставленным "на усмотрение реализации". Существуют случаи, когда мы не используем это правило. Один из примеров — установленное TCP-соединение, где мы используем адрес, сохраненный в tcb, в качестве источника. Другой пример — исходящий адрес для Объявления Соседа (Neighbor Advertisement). Согласно спецификации (RFC2461 7.2.2) источник NA должен быть целевым адресом соответствующего NS. В этом случае мы следуем спецификации, а не приведенному выше правилу наибольшего совпадения.
+Обратите внимание, что приведённое выше правило не документировано в спецификации IPv6. Оно считается элементом, оставленным "на усмотрение реализации". Существуют случаи, когда мы не используем это правило. Один из примеров — установленное TCP-соединение, где мы используем адрес, сохранённый в tcb, в качестве источника. Другой пример — исходящий адрес для Объявления Соседа (Neighbor Advertisement). Согласно спецификации (RFC2461 7.2.2) источник NA должен быть целевым адресом соответствующего NS. В этом случае мы следуем спецификации, а не приведённому выше правилу наибольшего совпадения.
Для новых соединений (когда правило 1 не применяется), устаревшие адреса (адреса с предпочтительным временем жизни = 0) не будут выбираться в качестве исходящего адреса, если доступны другие варианты. Если других вариантов нет, устаревший адрес будет использован в качестве последнего средства. Если есть несколько устаревших адресов, для выбора между ними будет применено указанное выше правило области видимости. Если вы хотите запретить использование устаревших адресов по какой-либо причине, установите параметр net.inet6.ip6.use_deprecated в значение 0. Проблема, связанная с устаревшими адресами, описана в RFC2462 5.5.4 (ПРИМЕЧАНИЕ: в IETF ipngwg ведутся дебаты о том, как использовать "устаревшие" адреса).
@@ -409,7 +409,7 @@
Комментарии о принимающей стороне:
-Похоже, что в RFC2553 слишком мало сказано о проблеме привязки к подстановочному адресу, особенно о вопросе пространства портов, режиме отказа и взаимосвязи между AF_INET/INET6 wildcard bind. Может быть несколько различных интерпретаций этого RFC, которые соответствуют ему, но ведут себя по-разному. Поэтому для создания переносимых приложений не следует делать никаких предположений о поведении в ядре. Использование man:getaddrinfo[3] является наиболее безопасным способом. Вопросы пространства номеров портов и привязки к подстановочному адресу подробно обсуждались в рассылке ipv6imp в середине марта 1999 года, и похоже, что конкретного консенсуса нет (то есть, остается на усмотрение реализаторов). Возможно, вам стоит проверить архивы рассылки.
+Похоже, что в RFC2553 слишком мало сказано о проблеме привязки к подстановочному адресу, особенно о вопросе пространства портов, режиме отказа и взаимосвязи между AF_INET/INET6 wildcard bind. Может быть несколько различных интерпретаций этого RFC, которые соответствуют ему, но ведут себя по-разному. Поэтому для создания переносимых приложений не следует делать никаких предположений о поведении в ядре. Использование man:getaddrinfo[3] является наиболее безопасным способом. Вопросы пространства номеров портов и привязки к подстановочному адресу подробно обсуждались в рассылке ipv6imp в середине марта 1999 года, и похоже, что конкретного консенсуса нет (то есть, остаётся на усмотрение реализаторов). Возможно, вам стоит проверить архивы рассылки.
Если серверное приложение хочет принимать IPv4 и IPv6 соединения, есть два варианта.
@@ -446,7 +446,7 @@
===== унифицированный код tcp и inpcb
-FreeBSD 4.x использует общий код tcp для IPv4 и IPv6 (из sys/netinet/tcp*) и раздельный код udp4/6. В нем используется унифицированная структура inpcb.
+FreeBSD 4.x использует общий код tcp для IPv4 и IPv6 (из sys/netinet/tcp*) и раздельный код udp4/6. В нём используется унифицированная структура inpcb.
Платформа может быть настроена для поддержки IPv4-отображённых адресов. Конфигурация ядра кратко описана ниже:
@@ -543,7 +543,7 @@
[[ipsec-implementation]]
=== IPsec
-IPsec состоит в основном из трех компонент.
+IPsec состоит в основном из трёх компонент.
. Управление политиками
. Управление ключами
@@ -631,7 +631,7 @@
IPsec (в ядре) и IKE (в пользовательском пространстве как "racoon") были протестированы на нескольких мероприятиях по тестированию взаимодействия и известно, что они хорошо работают со многими другими реализациями. Кроме того, текущая реализация IPsec поддерживает довольно широкий спектр криптографических алгоритмов IPsec, описанных в RFC (мы поддерживаем только алгоритмы без проблем с интеллектуальной собственностью).
[[ipsec-ecn]]
-==== Учет ECN в IPsec-туннелях
+==== Учёт ECN в IPsec-туннелях
Поддерживается ECN-совместимый IPsec-туннель, как описано в [.filename]#draft-ipsec-ecn-00.txt#.
@@ -641,7 +641,7 @@
Реализация туннеля IPsec может обеспечить три варианта поведения, в зависимости от значения параметра `net.inet.ipsec.ecn` (или `net.inet6.ipsec6.ecn`):
-* RFC2401: отсутствие учета ECN (значение sysctl -1)
+* RFC2401: отсутствие учёта ECN (значение sysctl -1)
* ECN запрещён (значение sysctl 0)
* ECN разрешён (значение sysctl 1)
diff --git a/documentation/content/ru/books/developers-handbook/ipv6/_index.po b/documentation/content/ru/books/developers-handbook/ipv6/_index.po
--- a/documentation/content/ru/books/developers-handbook/ipv6/_index.po
+++ b/documentation/content/ru/books/developers-handbook/ipv6/_index.po
@@ -1,12 +1,12 @@
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
-# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-11-08 16:17+0000\n"
-"PO-Revision-Date: 2025-11-12 04:45+0000\n"
+"PO-Revision-Date: 2026-03-04 20:01+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbookipv6_index/ru/>\n"
@@ -140,9 +140,10 @@
"way, and it covers \"configured tunnel\" described in the spec. See crossref:"
"ipv6[gif,Generic Tunnel Interface] in this document for details."
msgstr ""
-"man:gif[4] интерфейс реализует IPv[46]-поверх-IPv[46] туннель в общем виде и "
-"включает \"настроенный туннель\", описанный в спецификации. Подробности см. "
-"в crossref:ipv6[gif,Универсальный Туннельный Интерфейс] этого документа."
+"Интерфейс man:gif[4] реализует IPv[46]-поверх-IPv[46] туннель в общем виде и "
+"включает \"настроенный туннель\", описанный в спецификации. За подробностями "
+"обратитесь к разделу crossref:ipv6[gif,Универсальный туннельный интерфейс] "
+"этого документа."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:86
@@ -366,7 +367,7 @@
"[.filename]#draft-ietf-ipngwg-icmp-namelookups-02#: IPv6 Name Lookups "
"Through ICMP"
msgstr ""
-"[.filename]#draft-ietf-ipngwg-icmp-namelookups-02#: Поиск имен через ICMP в "
+"[.filename]#draft-ietf-ipngwg-icmp-namelookups-02#: Поиск имён через ICMP в "
"IPv6"
#. type: Plain text
@@ -375,7 +376,7 @@
"[.filename]#draft-ietf-ipngwg-icmp-name-lookups-03#: IPv6 Name Lookups "
"Through ICMP"
msgstr ""
-"[.filename]#draft-ietf-ipngwg-icmp-name-lookups-03#: Поиск имен IPv6 через "
+"[.filename]#draft-ietf-ipngwg-icmp-name-lookups-03#: Поиск имён IPv6 через "
"ICMP"
#. type: Plain text
@@ -950,7 +951,7 @@
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:321
#, no-wrap
msgid "Generic Tunnel Interface"
-msgstr "Универсальный Туннельный Интерфейс"
+msgstr "Универсальный туннельный интерфейс"
#. type: Plain text
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:325
@@ -1005,7 +1006,7 @@
"gif[4] for how to configure."
msgstr ""
"gif можно настроить так, чтобы он был дружественным к ECN. Подробнее о "
-"дружелюбности к ECN для туннелей см. crossref:ipv6[ipsec-ecn,Учет ECN в "
+"дружелюбности к ECN для туннелей см. crossref:ipv6[ipsec-ecn,Учёт ECN в "
"IPsec-туннелях], а о настройке — в man:gif[4]."
#. type: Plain text
@@ -1127,14 +1128,14 @@
"should be the target address of the corresponding NS's target. In this case "
"we follow the spec rather than the above longest-match rule."
msgstr ""
-"Обратите внимание, что приведенное выше правило не документировано в "
+"Обратите внимание, что приведённое выше правило не документировано в "
"спецификации IPv6. Оно считается элементом, оставленным \"на усмотрение "
"реализации\". Существуют случаи, когда мы не используем это правило. Один из "
"примеров — установленное TCP-соединение, где мы используем адрес, "
-"сохраненный в tcb, в качестве источника. Другой пример — исходящий адрес для "
-"Объявления Соседа (Neighbor Advertisement). Согласно спецификации (RFC2461 "
-"7.2.2) источник NA должен быть целевым адресом соответствующего NS. В этом "
-"случае мы следуем спецификации, а не приведенному выше правилу наибольшего "
+"сохранённый в tcb, в качестве источника. Другой пример — исходящий адрес для "
+"Объявления Соседа (Neighbor Advertisement). Согласно спецификации (RFC2461 7."
+"2.2) источник NA должен быть целевым адресом соответствующего NS. В этом "
+"случае мы следуем спецификации, а не приведённому выше правилу наибольшего "
"совпадения."
#. type: Plain text
@@ -1666,12 +1667,12 @@
"отказа и взаимосвязи между AF_INET/INET6 wildcard bind. Может быть "
"несколько различных интерпретаций этого RFC, которые соответствуют ему, но "
"ведут себя по-разному. Поэтому для создания переносимых приложений не "
-"следует делать никаких предположений о поведении в ядре. Использование man:"
-"getaddrinfo[3] является наиболее безопасным способом. Вопросы пространства "
-"номеров портов и привязки к подстановочному адресу подробно обсуждались в "
-"рассылке ipv6imp в середине марта 1999 года, и похоже, что конкретного "
-"консенсуса нет (то есть, остается на усмотрение реализаторов). Возможно, "
-"вам стоит проверить архивы рассылки."
+"следует делать никаких предположений о поведении в ядре. Использование "
+"man:getaddrinfo[3] является наиболее безопасным способом. Вопросы "
+"пространства номеров портов и привязки к подстановочному адресу подробно "
+"обсуждались в рассылке ipv6imp в середине марта 1999 года, и похоже, что "
+"конкретного консенсуса нет (то есть, остаётся на усмотрение реализаторов). "
+"Возможно, вам стоит проверить архивы рассылки."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:534
@@ -1867,7 +1868,7 @@
"tcp*) and separate udp4/6 code. It uses unified inpcb structure."
msgstr ""
"FreeBSD 4.x использует общий код tcp для IPv4 и IPv6 (из sys/netinet/tcp*) и "
-"раздельный код udp4/6. В нем используется унифицированная структура inpcb."
+"раздельный код udp4/6. В нём используется унифицированная структура inpcb."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:588
@@ -2208,7 +2209,7 @@
#. type: Plain text
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:690
msgid "IPsec is mainly organized by three components."
-msgstr "IPsec состоит в основном из трех компонент."
+msgstr "IPsec состоит в основном из трёх компонент."
#. type: Title ====
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:692
@@ -2610,7 +2611,7 @@
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:793
#, no-wrap
msgid "ECN Consideration on IPsec Tunnels"
-msgstr "Учет ECN в IPsec-туннелях"
+msgstr "Учёт ECN в IPsec-туннелях"
#. type: Plain text
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:796
@@ -2662,7 +2663,7 @@
#. type: Plain text
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:808
msgid "RFC2401: no consideration for ECN (sysctl value -1)"
-msgstr "RFC2401: отсутствие учета ECN (значение sysctl -1)"
+msgstr "RFC2401: отсутствие учёта ECN (значение sysctl -1)"
#. type: Plain text
#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:809
diff --git a/documentation/content/ru/books/developers-handbook/kerneldebug/_index.adoc b/documentation/content/ru/books/developers-handbook/kerneldebug/_index.adoc
--- a/documentation/content/ru/books/developers-handbook/kerneldebug/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/kerneldebug/_index.adoc
@@ -567,7 +567,7 @@
В зависимости от используемого компилятора, некоторые локальные переменные могут отображаться как `<optimized out>`, что не позволяет их напрямую исследовать с помощью `gdb`. Если это вызывает проблемы при отладке, можно собрать ядро с пониженным уровнем оптимизации, что может улучшить видимость некоторых переменных. Это можно сделать, передав `COPTFLAGS=-O1` в man:make[1]. Однако определённые классы ошибок в ядре могут проявляться иначе (или вообще не проявляться) при изменении уровня оптимизации.
====
-Вы можете использовать этот сеанс почти как любой другой сеанс GDB, включая полный доступ к исходному коду, запуск в режиме gud (Grand Unified Debugger) внутри окна Emacs (что дает автоматическое отображение исходного кода в другом окне Emacs) и т.д.
+Вы можете использовать этот сеанс почти как любой другой сеанс GDB, включая полный доступ к исходному коду, запуск в режиме gud (Grand Unified Debugger) внутри окна Emacs (что даёт автоматическое отображение исходного кода в другом окне Emacs) и т.д.
[[kerneldebug-console]]
== Отладка драйвера консоли
@@ -766,7 +766,7 @@
* `options WITNESS_SKIPSPIN`: отключает проверку порядка блокировки spinlock во время выполнения с WITNESS. Поскольку spin-блокировки чаще всего захватываются в планировщике, а события планировщика происходят часто, эта опция может значительно ускорить системы, работающие с WITNESS. Эта опция зависит от `options WITNESS`.
* `options WITNESS_KDB`: изменяет значение по умолчанию системной настройки `debug.witness.kdb` на 1, что приводит к входу в отладчик при обнаружении нарушения порядка блокировок вместо простого вывода предупреждения. Эта опция зависит от `options WITNESS`.
* `options SOCKBUF_DEBUG`: выполнять расширенную проверку согласованности сокетных буферов во время выполнения, что может быть полезно для отладки как ошибок в сокетах, так и состояний гонки в протоколах и драйверах устройств, взаимодействующих с сокетами. Данная опция значительно влияет на производительность сети и может изменить временные параметры в состояниях гонки драйверов устройств.
-* `options DEBUG_VFS_LOCKS`: отслеживает точки получения блокировок для lockmgr/vnode, расширяя объем информации, отображаемой командой `show lockedvnods` в DDB. Данная опция оказывает заметное влияние на производительность.
+* `options DEBUG_VFS_LOCKS`: отслеживает точки получения блокировок для lockmgr/vnode, расширяя объём информации, отображаемой командой `show lockedvnods` в DDB. Данная опция оказывает заметное влияние на производительность.
* `options DEBUG_MEMGUARD`: замена для man:malloc[9], аллокатор памяти ядра, который использует систему VM для обнаружения чтения или записи в освобождённую память. Подробности можно найти в man:memguard[9]. Данная опция значительно влияет на производительность, но может быть очень полезна при отладке ошибок повреждения памяти ядра.
* `options DIAGNOSTIC`: включает дополнительные, более затратные диагностические тесты, аналогичные `options INVARIANTS`.
* `options KASAN`: включает отладчик адресов ядра (Kernel Address Sanitizer). Это включает инструментирование компилятора, которое может использоваться для обнаружения недопустимых обращений к памяти в ядре, таких как использование после освобождения и переполнение буфера. В значительной степени заменяет `options DEBUG_MEMGUARD`. Подробности и список поддерживаемых платформ см. в man:kasan[9].
diff --git a/documentation/content/ru/books/developers-handbook/kerneldebug/_index.po b/documentation/content/ru/books/developers-handbook/kerneldebug/_index.po
--- a/documentation/content/ru/books/developers-handbook/kerneldebug/_index.po
+++ b/documentation/content/ru/books/developers-handbook/kerneldebug/_index.po
@@ -1,12 +1,12 @@
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
-# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-06-29 21:20+0100\n"
-"PO-Revision-Date: 2025-11-12 04:45+0000\n"
+"PO-Revision-Date: 2026-03-04 20:01+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbookkerneldebug_index/ru/>\n"
@@ -1400,7 +1400,7 @@
msgstr ""
"Вы можете использовать этот сеанс почти как любой другой сеанс GDB, включая "
"полный доступ к исходному коду, запуск в режиме gud (Grand Unified Debugger) "
-"внутри окна Emacs (что дает автоматическое отображение исходного кода в "
+"внутри окна Emacs (что даёт автоматическое отображение исходного кода в "
"другом окне Emacs) и т.д."
#. type: Title ==
@@ -2170,7 +2170,7 @@
"in DDB. This option has a measurable performance impact."
msgstr ""
"`options DEBUG_VFS_LOCKS`: отслеживает точки получения блокировок для "
-"lockmgr/vnode, расширяя объем информации, отображаемой командой `show "
+"lockmgr/vnode, расширяя объём информации, отображаемой командой `show "
"lockedvnods` в DDB. Данная опция оказывает заметное влияние на "
"производительность."
diff --git a/documentation/content/ru/books/developers-handbook/l10n/_index.adoc b/documentation/content/ru/books/developers-handbook/l10n/_index.adoc
--- a/documentation/content/ru/books/developers-handbook/l10n/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/l10n/_index.adoc
@@ -58,7 +58,7 @@
=== Призыв к объединению усилий по интернационализации
-Нам стало известно, что индивидуальные усилия по интернационализации (I18N) и локализации (L10N) в каждой стране дублируют работу друг друга. Многие из нас снова и снова неэффективно изобретают велосипед. Мы надеемся, что различные крупные группы разработчиков в области I18N смогут объединится для совместной работы и ответственности, подобно Core Team в FreeBSD.
+Нам стало известно, что индивидуальные усилия по интернационализации (I18N) и локализации (L10N) в каждой стране дублируют работу друг друга. Многие из нас снова и снова неэффективно изобретают велосипед. Мы надеемся, что различные крупные группы разработчиков в области I18N смогут объединится для совместной работы и ответственности, подобно Основной команде в FreeBSD.
В настоящее время мы надеемся, что при написании или портировании I18N-программ вы будете отправлять их в соответствующие списки рассылки FreeBSD каждой страны для тестирования. В будущем мы надеемся создать приложения, которые будут работать на всех языках "из коробки" без грязных хаков.
diff --git a/documentation/content/ru/books/developers-handbook/l10n/_index.po b/documentation/content/ru/books/developers-handbook/l10n/_index.po
--- a/documentation/content/ru/books/developers-handbook/l10n/_index.po
+++ b/documentation/content/ru/books/developers-handbook/l10n/_index.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-11-08 16:17+0000\n"
-"PO-Revision-Date: 2025-11-11 04:45+0000\n"
+"PO-Revision-Date: 2025-11-21 04:45+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbookl10n_index/ru/>\n"
@@ -93,7 +93,7 @@
"и локализации (L10N) в каждой стране дублируют работу друг друга. Многие из "
"нас снова и снова неэффективно изобретают велосипед. Мы надеемся, что "
"различные крупные группы разработчиков в области I18N смогут объединится для "
-"совместной работы и ответственности, подобно Core Team в FreeBSD."
+"совместной работы и ответственности, подобно Основной команде в FreeBSD."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:73
diff --git a/documentation/content/ru/books/developers-handbook/policies/_index.adoc b/documentation/content/ru/books/developers-handbook/policies/_index.adoc
--- a/documentation/content/ru/books/developers-handbook/policies/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/policies/_index.adoc
@@ -110,18 +110,18 @@
. Любой файл, который интерпретируется или выполняется процессором(-ами) системы и не представлен в исходном формате, является обременённым.
. Любой файл с лицензией более ограничительной, чем BSD или GNU, является обременённым.
. Файл, содержащий загружаемые двоичные данные для использования оборудованием, не является обремененным, если к нему не применяется пункт (1) или (2).
-. Любой файл с правовыми ограничениями требует специального одобрения от link:https://www.FreeBSD.org/administration/#t-core[Core Team] перед добавлением в репозиторий.
+. Любой файл с правовыми ограничениями требует специального одобрения от link:https://www.FreeBSD.org/administration/#t-core[Основной команды (Core Team)] перед добавлением в репозиторий.
. Обремененные файлы помещаются в [.filename]#src/contrib# или [.filename]#src/sys/contrib#.
. Весь модуль должен храниться вместе. Нет смысла разделять его, если только нет совместного использования кода с необременённой частью кода.
. В прошлом бинарные файлы обычно кодировались с помощью uuencode и назывались [.filename]#arch/filename.o.uu#. Теперь в этом нет необходимости, и бинарные файлы могут добавляться в репозиторий без изменений.
. Файлы ядра системы:
.. Всегда должны быть указана в [.filename]#conf/files.*# (для упрощения сборки).
-.. Всегда должны быть в [.filename]#LINT#, но link:https://www.FreeBSD.org/administration/#t-core[Core Team] решает в каждом конкретном случае, следует ли их закомментировать или нет. link:https://www.FreeBSD.org/administration/#t-core[Core Team] может, конечно, позже изменить свое решение.
+.. Всегда должны быть в [.filename]#LINT#, но link:https://www.FreeBSD.org/administration/#t-core[Основная команда (Core Team)] решает в каждом конкретном случае, следует ли их закомментировать или нет. link:https://www.FreeBSD.org/administration/#t-core[Основная команда] может, конечно, позже изменить свое решение.
.. _Инженер по выпуску_ решает, будет ли это включено в выпуск.
. Пользовательские файлы:
-.. Команда link:https://www.FreeBSD.org/administration/#t-core[Core team] принимает решение о включении кода в базовую устанавливаемую систему.
-.. link:https://www.FreeBSD.org/administration/#t-re[Отдел разработки релизов] решает, войдет ли это в релиз.
+.. Команда link:https://www.FreeBSD.org/administration/#t-core[Основная команда (Core team)] принимает решение о включении кода в базовую устанавливаемую систему.
+.. link:https://www.FreeBSD.org/administration/#t-re[Команда подготовки релизов] решает, будет ли это включено в релиз.
[[policies-shlib]]
== Динамические библиотеки
@@ -139,7 +139,7 @@
* Настоятельно рекомендуется добавить контроль версий символов в новую библиотеку
* Если есть несовместимое изменение, обработайте его с помощью версионирования символов, сохраняя обратную совместимость ABI
* Если это невозможно или библиотека не использует версионирование символов, увеличьте версию библиотеки
-* Прежде чем даже рассматривать увеличение версии библиотеки для библиотеки с версионированием символов, проконсультируйтесь с командой Release Engineering, предоставив причины, почему изменение настолько важно, что его следует разрешить, несмотря на нарушение ABI
+* Прежде чем даже рассматривать увеличение версии библиотеки для библиотеки с версионированием символов, проконсультируйтесь с Командой подготовки релизов, предоставив причины, почему изменение настолько важно, что его следует разрешить, несмотря на нарушение ABI
Например, добавленные функции и исправления ошибок, не изменяющие интерфейсы, допустимы, тогда как удалённые функции, изменённый синтаксис вызовов и т.д. должны либо предоставлять обратно-совместимые символы, либо приведут к изменению старшего номера версии.
diff --git a/documentation/content/ru/books/developers-handbook/policies/_index.po b/documentation/content/ru/books/developers-handbook/policies/_index.po
--- a/documentation/content/ru/books/developers-handbook/policies/_index.po
+++ b/documentation/content/ru/books/developers-handbook/policies/_index.po
@@ -1,12 +1,12 @@
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
-# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-06-29 21:20+0100\n"
-"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"PO-Revision-Date: 2026-03-04 20:01+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbookpolicies_index/ru/>\n"
@@ -304,8 +304,8 @@
"repository."
msgstr ""
"Любой файл с правовыми ограничениями требует специального одобрения от "
-"link:https://www.FreeBSD.org/administration/#t-core[Core Team] перед "
-"добавлением в репозиторий."
+"link:https://www.FreeBSD.org/administration/#t-core[Основной команды (Core "
+"Team)] перед добавлением в репозиторий."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/policies/_index.adoc:127
@@ -359,9 +359,10 @@
"Team] can, of course, change their minds later on."
msgstr ""
"Всегда должны быть в [.filename]#LINT#, но link:https://www.FreeBSD.org/"
-"administration/#t-core[Core Team] решает в каждом конкретном случае, следует "
-"ли их закомментировать или нет. link:https://www.FreeBSD.org/administration/"
-"#t-core[Core Team] может, конечно, позже изменить свое решение."
+"administration/#t-core[Основная команда (Core Team)] решает в каждом "
+"конкретном случае, следует ли их закомментировать или нет. link:https://www."
+"FreeBSD.org/administration/#t-core[Основная команда] может, конечно, позже "
+"изменить свое решение."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/policies/_index.adoc:134
@@ -379,8 +380,9 @@
"The link:https://www.FreeBSD.org/administration/#t-core[Core team] decides "
"if the code should be part of the installed base system."
msgstr ""
-"Команда link:https://www.FreeBSD.org/administration/#t-core[Core team] "
-"принимает решение о включении кода в базовую устанавливаемую систему."
+"Команда link:https://www.FreeBSD.org/administration/#t-core[Основная команда "
+"(Core team)] принимает решение о включении кода в базовую устанавливаемую "
+"систему."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/policies/_index.adoc:138
@@ -388,8 +390,8 @@
"The link:https://www.FreeBSD.org/administration/#t-re[Release Engineering] "
"decides if it goes into the release."
msgstr ""
-"link:https://www.FreeBSD.org/administration/#t-re[Отдел разработки релизов] "
-"решает, войдет ли это в релиз."
+"link:https://www.FreeBSD.org/administration/#t-re[Команда подготовки релизов]"
+" решает, будет ли это включено в релиз."
#. type: Title ==
#: documentation/content/en/books/developers-handbook/policies/_index.adoc:140
@@ -470,8 +472,8 @@
"change is so important that it should be allowed despite breaking the ABI"
msgstr ""
"Прежде чем даже рассматривать увеличение версии библиотеки для библиотеки с "
-"версионированием символов, проконсультируйтесь с командой Release "
-"Engineering, предоставив причины, почему изменение настолько важно, что его "
+"версионированием символов, проконсультируйтесь с Командой подготовки "
+"релизов, предоставив причины, почему изменение настолько важно, что его "
"следует разрешить, несмотря на нарушение ABI"
#. type: Plain text
diff --git a/documentation/content/ru/books/developers-handbook/secure/_index.adoc b/documentation/content/ru/books/developers-handbook/secure/_index.adoc
--- a/documentation/content/ru/books/developers-handbook/secure/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/secure/_index.adoc
@@ -70,7 +70,7 @@
Большинство современных компьютерных систем используют стек для передачи аргументов процедурам и хранения локальных переменных. Стек — это буфер типа "последним пришёл — первым ушёл" (LIFO) в верхней области памяти процесса. Когда программа вызывает функцию, создаётся новый "стековый кадр". Этот стековый кадр состоит из аргументов, переданных функции, а также динамического количества места для локальных переменных. "Указатель стека" — это регистр, который содержит текущее местоположение вершины стека. Поскольку это значение постоянно меняется по мере добавления новых значений на вершину стека, многие реализации также предоставляют "указатель кадра", который располагается вблизи начала стекового кадра, чтобы локальные переменные могли легче адресоваться относительно этого значения. crossref:bibliography[COD,1] Адрес возврата для вызовов функций также хранится в стеке, и это является причиной эксплойтов переполнения стека, поскольку переполнение локальной переменной в функции может перезаписать адрес возврата этой функции, потенциально позволяя злоумышленнику выполнить любой код по своему усмотрению.
-Хотя атаки на стек являются наиболее распространенными, также возможно переполнение стека с помощью атаки на кучу (malloc/free).
+Хотя атаки на стек являются наиболее распространёнными, также возможно переполнение стека с помощью атаки на кучу (malloc/free).
Язык программирования C не выполняет автоматическую проверку границ массивов или указателей, как это делают многие другие языки. Кроме того, стандартная библиотека C содержит множество очень опасных функций.
@@ -197,7 +197,7 @@
Суперпользователь в среде клетки имеет возможность:
-* Управлять учетными данными с помощью `setuid`, `seteuid`, `setgid`, `setegid`, `setgroups`, `setreuid`, `setregid`, `setlogin`
+* Управлять учётными данными с помощью `setuid`, `seteuid`, `setgid`, `setegid`, `setgroups`, `setreuid`, `setregid`, `setlogin`
* Устанавливать ограничений ресурсов с помощью `setrlimit`
* Изменять некоторые узлы sysctl (kern.hostname)
* `chroot()`
@@ -225,6 +225,6 @@
[[secure-race-conditions]]
== Состояние гонки
-Состояние гонки — это аномальное поведение, вызванное непредвиденной зависимостью от относительного времени событий. Другими словами, программист ошибочно предположил, что определенное событие всегда произойдет раньше другого.
+Состояние гонки — это аномальное поведение, вызванное непредвиденной зависимостью от относительного времени событий. Другими словами, программист ошибочно предположил, что определённое событие всегда произойдет раньше другого.
Некоторые из распространённых причин состояний гонки — это сигналы, проверки доступа и открытие файлов. Сигналы по своей природе являются асинхронными событиями, поэтому при работе с ними необходимо проявлять особую осторожность. Проверка доступа с помощью `access(2)`, а затем `open(2)` явно неатомарна. Пользователи могут перемещать файлы между этими двумя вызовами. Вместо этого привилегированные приложения должны использовать `seteuid()`, а затем вызывать `open()` напрямую. По аналогии, приложение всегда должно устанавливать правильную маску (`umask`) перед вызовом `open()`, чтобы избежать необходимости в лишних вызовах `chmod()`.
diff --git a/documentation/content/ru/books/developers-handbook/secure/_index.po b/documentation/content/ru/books/developers-handbook/secure/_index.po
--- a/documentation/content/ru/books/developers-handbook/secure/_index.po
+++ b/documentation/content/ru/books/developers-handbook/secure/_index.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-11-08 16:17+0000\n"
-"PO-Revision-Date: 2025-11-12 04:45+0000\n"
+"PO-Revision-Date: 2025-11-25 04:45+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbooksecure_index/ru/>\n"
@@ -155,7 +155,7 @@
"Although stack-based attacks are by far the most common, it would also be "
"possible to overrun the stack with a heap-based (malloc/free) attack."
msgstr ""
-"Хотя атаки на стек являются наиболее распространенными, также возможно "
+"Хотя атаки на стек являются наиболее распространёнными, также возможно "
"переполнение стека с помощью атаки на кучу (malloc/free)."
#. type: Plain text
@@ -645,8 +645,8 @@
"Manipulate credential with `setuid`, `seteuid`, `setgid`, `setegid`, "
"`setgroups`, `setreuid`, `setregid`, `setlogin`"
msgstr ""
-"Управлять учетными данными с помощью `setuid`, `seteuid`, `setgid`, "
-"`setegid`, `setgroups`, `setreuid`, `setregid`, `setlogin`"
+"Управлять учётными данными с помощью `setuid`, `seteuid`, `setgid`, `setegid`"
+", `setgroups`, `setreuid`, `setregid`, `setlogin`"
#. type: Plain text
#: documentation/content/en/books/developers-handbook/secure/_index.adoc:248
@@ -798,7 +798,7 @@
msgstr ""
"Состояние гонки — это аномальное поведение, вызванное непредвиденной "
"зависимостью от относительного времени событий. Другими словами, программист "
-"ошибочно предположил, что определенное событие всегда произойдет раньше "
+"ошибочно предположил, что определённое событие всегда произойдет раньше "
"другого."
#. type: Plain text
diff --git a/documentation/content/ru/books/developers-handbook/sockets/_index.adoc b/documentation/content/ru/books/developers-handbook/sockets/_index.adoc
--- a/documentation/content/ru/books/developers-handbook/sockets/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/sockets/_index.adoc
@@ -69,9 +69,9 @@
Часто думают, что _язык тела_ универсален. Но это не так. В ранней юности отец взял меня с собой в Болгарию. Мы сидели за столиком в парке Софии, когда к нам подошел продавец, предлагая купить жареный миндаль.
-Я тогда еще не знал болгарского, поэтому вместо словесного отказа я покачал головой из стороны в сторону — это «универсальный» язык тела для обозначения _нет_. Продавец тут же начал угощать нас миндалем.
+Я тогда ещё не знал болгарского, поэтому вместо словесного отказа я покачал головой из стороны в сторону — это «универсальный» язык тела для обозначения _нет_. Продавец тут же начал угощать нас миндалем.
-Затем я вспомнил, что мне говорили, будто в Болгарии покачивание головой из стороны в сторону означает _да_. Быстро я начал кивать головой вверх-вниз. Продавец заметил, взял свои миндалины и ушёл. Для непосвящённого наблюдателя я не изменил язык тела: я продолжал использовать движения головой — покачивание и кивание. Изменился _смысл_ языка тела. Сначала продавец и я интерпретировали одни и те же жесты как имеющие совершенно разный смысл. Мне пришлось скорректировать свою собственную интерпретацию этих жестов, чтобы продавец меня понял.
+Затем я вспомнил, что мне говорили, будто в Болгарии покачивание головой из стороны в сторону означает _да_. Быстро я начал кивать головой вверх-вниз. Продавец заметил, забрал свои орехи и ушёл. Для непосвящённого наблюдателя я не изменил язык тела: я продолжал использовать движения головой — покачивание и кивание. Изменился _смысл_ языка тела. Сначала продавец и я интерпретировали одни и те же жесты как имеющие совершенно разный смысл. Мне пришлось скорректировать свою собственную интерпретацию этих жестов, чтобы продавец меня понял.
То же самое и с компьютерами: одни и те же символы могут иметь разное, даже полностью противоположное значение. Поэтому, чтобы два компьютера понимали друг друга, они должны договориться не только об одном _языке_, но и об одном _толковании_ языка.
@@ -217,7 +217,7 @@
Обратите внимание на _неопределённость_, с которой объявлено поле `sa_data` — просто как массив из `14` байт, с комментарием, намекающим, что их может быть больше `14`.
-Эта неопределенность вполне преднамеренна. Сокеты — это очень мощный интерфейс. Хотя большинство людей, возможно, считают их не более чем интерфейсом для Интернета — и большинство приложений, вероятно, используют их именно для этого в наши дни — сокеты могут быть использованы практически для _любого_ вида межпроцессного взаимодействия, из которых Интернет (или, точнее, IP) — лишь один из них.
+Эта неопределённость вполне преднамеренна. Сокеты — это очень мощный интерфейс. Хотя большинство людей, возможно, считают их не более чем интерфейсом для Интернета — и большинство приложений, вероятно, используют их именно для этого в наши дни — сокеты могут быть использованы практически для _любого_ вида межпроцессного взаимодействия, из которых Интернет (или, точнее, IP) — лишь один из них.
[.filename]#sys/socket.h# ссылается на различные типы протоколов, с которыми работают сокеты, как на _семейства адресов_, и перечисляет их непосредственно перед определением `sockaddr`:
@@ -298,7 +298,7 @@
Три важных поля — это `sin_family`, которое находится в байте 1 структуры, `sin_port`, 16-битное значение, расположенное в байтах 2 и 3, и `sin_addr`, 32-битное целочисленное представление IP-адреса, хранящееся в байтах 4–7.
-Теперь попробуем заполнить его. Предположим, мы пытаемся написать клиент для протокола _daytime_, который просто указывает, что его сервер записывает текстовую строку с текущей датой и временем в порт 13. Мы хотим использовать TCP/IP, поэтому нам нужно указать `AF_INET` в поле семейства адресов. `AF_INET` определен как `2`. Давайте используем IP-адрес `192.43.244.18`, который является сервером времени федерального правительства США (`time.nist.gov`).
+Теперь попробуем заполнить его. Предположим, мы пытаемся написать клиент для протокола _daytime_, который просто указывает, что его сервер записывает текстовую строку с текущей датой и временем в порт 13. Мы хотим использовать TCP/IP, поэтому нам нужно указать `AF_INET` в поле семейства адресов. `AF_INET` определен как `2`. Давайте используем IP-адрес `132.163.96.1`, который является сервером времени федерального правительства США (`time.nist.gov`).
.Конкретный пример sockaddr_in
image::sainfill.png[]
@@ -317,7 +317,7 @@
В дополнение, `in_addr_t` является 32-битным целым числом.
-`192.43.244.18` — это просто удобная форма записи 32-битного целого числа, в которой перечисляются все его 8-битные байты, начиная с _старшего_.
+`132.163.96.1` — это просто удобная форма записи 32-битного целого числа, в которой перечисляются все его 8-битные байты, начиная с _старшего_.
До сих пор мы рассматривали `sockaddr` как абстракцию. Наш компьютер не хранит `short` целые числа как единую 16-битную сущность, а как последовательность 2 байт. Аналогично, он хранит 32-битные целые числа как последовательность 4 байт.
@@ -327,7 +327,7 @@
....
sa.sin_family = AF_INET;
sa.sin_port = 13;
-sa.sin_addr.s_addr = (((((192 << 8) | 43) << 8) | 244) << 8) | 18;
+sa.sin_addr.s_addr = (((((132 << 8) | 163) << 8) | 96) << 8) | 1;
....
Как будет выглядеть результат?
@@ -386,7 +386,7 @@
....
sa.sin_family = AF_INET;
sa.sin_port = 13 << 8;
-sa.sin_addr.s_addr = (((((18 << 8) | 244) << 8) | 43) << 8) | 192;
+sa.sin_addr.s_addr = (((((1 << 8) | 96) << 8) | 163) << 8) | 132;
....
Это _обманет_ наш компилятор, заставив его сохранить данные в _порядке байтов сети_. В некоторых случаях это именно тот способ, который нужен (например, при программировании на ассемблере). Однако в большинстве случаев это может вызвать проблему.
@@ -429,7 +429,7 @@
[[sockets-first-client]]
===== Наш первый клиент
-Теперь мы знаем достаточно, чтобы написать очень простого клиента, который получит текущее время от `192.43.244.18` и выведет его в [.filename]#stdout#.
+Теперь мы знаем достаточно, чтобы написать очень простого клиента, который получит текущее время от `132.163.96.1` и выведет его в [.filename]#stdout#.
[.programlisting]
....
@@ -459,7 +459,7 @@
sa.sin_family = AF_INET;
sa.sin_port = htons(13);
- sa.sin_addr.s_addr = htonl((((((192 << 8) | 43) << 8) | 244) << 8) | 18);
+ sa.sin_addr.s_addr = htonl((((((132 << 8) | 163) << 8) | 96) << 8) | 1);
if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
perror("connect");
close(s);
@@ -535,7 +535,7 @@
[[sockets-accept]]
===== `accept`
-После того как вы услышите телефонный звонок, вы принимаете вызов, отвечая на звонок. Теперь вы установили соединение с вашим клиентом. Это соединение остается активным, пока вы или ваш клиент не повесите трубку.
+После того как вы услышите телефонный звонок, вы принимаете вызов, отвечая на звонок. Теперь вы установили соединение с вашим клиентом. Это соединение остаётся активным, пока вы или ваш клиент не повесите трубку.
Сервер принимает соединение, используя функцию man:accept[2].
@@ -658,7 +658,7 @@
sa.sin_addr.s_addr = htonl(INADDR_ANY);
....
-Его значение равно `0`. Поскольку мы только что использовали `bzero` для всей структуры, будет избыточным снова устанавливать его в `0`. Но если мы перенесем наш код на другую систему, где INADDR_ANY, возможно, не равен нулю, нам нужно будет присвоить его `sa.sin_addr.s_addr`. Большинство современных компиляторов C достаточно умны, чтобы заметить, что INADDR_ANY — это константа. Пока она равна нулю, они оптимизируют все условное выражение из кода.
+Его значение равно `0`. Поскольку мы только что использовали `memset`, чтобы установить в 0 все байты структуры, будет избыточным снова устанавливать его в `0`. Но если мы перенесём наш код на другую систему, где INADDR_ANY, возможно, не равен нулю, нам нужно будет присвоить его `sa.sin_addr.s_addr`. Большинство современных компиляторов C достаточно умны, чтобы заметить, что INADDR_ANY — это константа. Пока она равна нулю, они оптимизируют все условное выражение из кода.
После успешного вызова `bind` мы готовы стать _демоном_: используем `fork` для создания дочернего процесса. В обоих процессах, родительском и дочернем, переменная `s` является нашим сокетом. Родительскому процессу он больше не нужен, поэтому он вызывает `close`, затем возвращает `0`, чтобы сообщить своему родителю об успешном завершении.
@@ -705,7 +705,7 @@
#
....
-Что... Ничего? Давайте попробуем еще раз:
+Что... Ничего? Давайте попробуем ещё раз:
[source, bash]
....
@@ -772,7 +772,7 @@
[[sockets-helper-functions]]
== Вспомогательные функции
-Библиотека C в FreeBSD содержит множество вспомогательных функций для программирования сокетов. Например, в нашем примере клиента мы жестко прописали IP-адрес `time.nist.gov`. Но мы не всегда знаем IP-адрес. Даже если знаем, наше программное обеспечение будет более гибким, если позволит пользователю ввести IP-адрес или даже доменное имя.
+Библиотека C в FreeBSD содержит множество вспомогательных функций для программирования сокетов. Например, в нашем примере клиента мы жёстко прописали IP-адрес `time.nist.gov`. Но мы не всегда знаем IP-адрес. Даже если знаем, наше программное обеспечение будет более гибким, если позволит пользователю ввести IP-адрес или даже доменное имя.
[[sockets-gethostbyname]]
=== `gethostbyname`
@@ -844,7 +844,7 @@
}
....
-Теперь мы можем ввести доменное имя (или IP-адрес, это работает в обоих направлениях) в командной строке, и программа попытается подключиться к его серверу _daytime_. В противном случае, по умолчанию будет использоваться `time.nist.gov`. Однако даже в этом случае мы будем использовать `gethostbyname` вместо жесткого задания `192.43.244.18`. Таким образом, даже если его IP-адрес изменится в будущем, мы всё равно сможем его найти.
+Теперь мы можем ввести доменное имя (или IP-адрес, это работает в обоих направлениях) в командной строке, и программа попытается подключиться к его серверу _daytime_. В противном случае по умолчанию будет использоваться `time.nist.gov`. Однако даже в этом случае мы будем использовать `gethostbyname` вместо жёсткого указания `132.163.96.1`. Таким образом, даже если его IP-адрес изменится в будущем, мы всё равно сможем его найти.
Поскольку получение времени от локального сервера занимает практически нулевое время, вы можете запустить daytime дважды подряд: сначала для получения времени от `time.nist.gov`, а затем от вашей собственной системы. После этого вы можете сравнить результаты и увидеть, насколько точны часы вашей системы:
diff --git a/documentation/content/ru/books/developers-handbook/sockets/_index.po b/documentation/content/ru/books/developers-handbook/sockets/_index.po
--- a/documentation/content/ru/books/developers-handbook/sockets/_index.po
+++ b/documentation/content/ru/books/developers-handbook/sockets/_index.po
@@ -1,12 +1,12 @@
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
-# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
-"POT-Creation-Date: 2025-05-01 19:56-0300\n"
-"PO-Revision-Date: 2025-11-12 04:45+0000\n"
+"POT-Creation-Date: 2026-02-22 15:58+0000\n"
+"PO-Revision-Date: 2026-03-04 20:01+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbooksockets_index/ru/>\n"
@@ -130,7 +130,7 @@
"my head from side to side, the \"universal\" body language for _no_. The "
"vendor quickly started serving us some almonds."
msgstr ""
-"Я тогда еще не знал болгарского, поэтому вместо словесного отказа я покачал "
+"Я тогда ещё не знал болгарского, поэтому вместо словесного отказа я покачал "
"головой из стороны в сторону — это «универсальный» язык тела для обозначения "
"_нет_. Продавец тут же начал угощать нас миндалем."
@@ -148,8 +148,8 @@
msgstr ""
"Затем я вспомнил, что мне говорили, будто в Болгарии покачивание головой из "
"стороны в сторону означает _да_. Быстро я начал кивать головой вверх-вниз. "
-"Продавец заметил, взял свои миндалины и ушёл. Для непосвящённого наблюдателя "
-"я не изменил язык тела: я продолжал использовать движения головой — "
+"Продавец заметил, забрал свои орехи и ушёл. Для непосвящённого наблюдателя я "
+"не изменил язык тела: я продолжал использовать движения головой — "
"покачивание и кивание. Изменился _смысл_ языка тела. Сначала продавец и я "
"интерпретировали одни и те же жесты как имеющие совершенно разный смысл. Мне "
"пришлось скорректировать свою собственную интерпретацию этих жестов, чтобы "
@@ -671,7 +671,8 @@
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:252
msgid "Use `PF_INET` for UDP, TCP and other Internet protocols (IPv4)."
-msgstr "Используйте `PF_INET` для UDP, TCP и других интернет-протоколов (IPv4)."
+msgstr ""
+"Используйте `PF_INET` для UDP, TCP и других интернет-протоколов (IPv4)."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:256
@@ -681,10 +682,11 @@
"`SOCK_STREAM`, which tells the system you are asking for a _reliable stream "
"delivery service_ (which is TCP when used with `PF_INET`)."
msgstr ""
-"Для аргумента `type` определено пять значений, также указанных в [.filename]#"
-"sys/socket.h#. Все они начинаются с \"`SOCK_`\". Наиболее распространённое — "
-"`SOCK_STREAM`, которое указывает системе, что запрашивается _надёжный сервис "
-"потоковой доставки_ (это TCP при использовании с `PF_INET`)."
+"Для аргумента `type` определено пять значений, также указанных в [."
+"filename]#sys/socket.h#. Все они начинаются с \"`SOCK_`\". Наиболее "
+"распространённое — `SOCK_STREAM`, которое указывает системе, что "
+"запрашивается _надёжный сервис потоковой доставки_ (это TCP при "
+"использовании с `PF_INET`)."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:258
@@ -793,8 +795,8 @@
"as an array of `14` bytes, with the comment hinting there can be more than "
"`14` of them."
msgstr ""
-"Обратите внимание на _неопределённость_, с которой объявлено поле `sa_data` —"
-" просто как массив из `14` байт, с комментарием, намекающим, что их может "
+"Обратите внимание на _неопределённость_, с которой объявлено поле `sa_data` "
+"— просто как массив из `14` байт, с комментарием, намекающим, что их может "
"быть больше `14`."
#. type: Plain text
@@ -806,7 +808,7 @@
"can be used for just about _any_ kind of interprocess communications, of "
"which the Internet (or, more precisely, IP) is only one."
msgstr ""
-"Эта неопределенность вполне преднамеренна. Сокеты — это очень мощный "
+"Эта неопределённость вполне преднамеренна. Сокеты — это очень мощный "
"интерфейс. Хотя большинство людей, возможно, считают их не более чем "
"интерфейсом для Интернета — и большинство приложений, вероятно, используют "
"их именно для этого в наши дни — сокеты могут быть использованы практически "
@@ -1010,14 +1012,14 @@
"write a text string representing the current date and time to port 13. We "
"want to use TCP/IP, so we need to specify `AF_INET` in the address family "
"field. `AF_INET` is defined as `2`. Let us use the IP address of "
-"`192.43.244.18`, which is the time server of US federal government "
-"(`time.nist.gov`)."
+"`132.163.96.1`, which is the time server of US federal government (`time."
+"nist.gov`)."
msgstr ""
"Теперь попробуем заполнить его. Предположим, мы пытаемся написать клиент для "
"протокола _daytime_, который просто указывает, что его сервер записывает "
"текстовую строку с текущей датой и временем в порт 13. Мы хотим использовать "
"TCP/IP, поэтому нам нужно указать `AF_INET` в поле семейства адресов. "
-"`AF_INET` определен как `2`. Давайте используем IP-адрес `192.43.244.18`, "
+"`AF_INET` определен как `2`. Давайте используем IP-адрес `132.163.96.1`, "
"который является сервером времени федерального правительства США (`time.nist."
"gov`)."
@@ -1068,11 +1070,11 @@
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:406
msgid ""
-"The `192.43.244.18` is just a convenient notation of expressing a 32-bit "
+"The `132.163.96.1` is just a convenient notation of expressing a 32-bit "
"integer by listing all of its 8-bit bytes, starting with the _most "
"significant_ one."
msgstr ""
-"`192.43.244.18` — это просто удобная форма записи 32-битного целого числа, в "
+"`132.163.96.1` — это просто удобная форма записи 32-битного целого числа, в "
"которой перечисляются все его 8-битные байты, начиная с _старшего_."
#. type: Plain text
@@ -1098,11 +1100,11 @@
msgid ""
"sa.sin_family = AF_INET;\n"
"sa.sin_port = 13;\n"
-"sa.sin_addr.s_addr = (((((192 << 8) | 43) << 8) | 244) << 8) | 18;\n"
+"sa.sin_addr.s_addr = (((((132 << 8) | 163) << 8) | 96) << 8) | 1;\n"
msgstr ""
"sa.sin_family = AF_INET;\n"
"sa.sin_port = 13;\n"
-"sa.sin_addr.s_addr = (((((192 << 8) | 43) << 8) | 244) << 8) | 18;\n"
+"sa.sin_addr.s_addr = (((((132 << 8) | 163) << 8) | 96) << 8) | 1;\n"
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:421
@@ -1332,11 +1334,11 @@
msgid ""
"sa.sin_family = AF_INET;\n"
"sa.sin_port = 13 << 8;\n"
-"sa.sin_addr.s_addr = (((((18 << 8) | 244) << 8) | 43) << 8) | 192;\n"
+"sa.sin_addr.s_addr = (((((1 << 8) | 96) << 8) | 163) << 8) | 132;\n"
msgstr ""
"sa.sin_family = AF_INET;\n"
"sa.sin_port = 13 << 8;\n"
-"sa.sin_addr.s_addr = (((((18 << 8) | 244) << 8) | 43) << 8) | 192;\n"
+"sa.sin_addr.s_addr = (((((1 << 8) | 96) << 8) | 163) << 8) | 132;\n"
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:494
@@ -1347,8 +1349,8 @@
"problem."
msgstr ""
"Это _обманет_ наш компилятор, заставив его сохранить данные в _порядке "
-"байтов сети_. В некоторых случаях это именно тот способ, который нужен ("
-"например, при программировании на ассемблере). Однако в большинстве случаев "
+"байтов сети_. В некоторых случаях это именно тот способ, который нужен "
+"(например, при программировании на ассемблере). Однако в большинстве случаев "
"это может вызвать проблему."
#. type: Plain text
@@ -1525,10 +1527,10 @@
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:550
msgid ""
"We now know enough to write a very simple client, one that will get current "
-"time from `192.43.244.18` and print it to [.filename]#stdout#."
+"time from `132.163.96.1` and print it to [.filename]#stdout#."
msgstr ""
"Теперь мы знаем достаточно, чтобы написать очень простого клиента, который "
-"получит текущее время от `192.43.244.18` и выведет его в [.filename]#stdout#."
+"получит текущее время от `132.163.96.1` и выведет его в [.filename]#stdout#."
#. type: delimited block . 4
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:564
@@ -1600,7 +1602,7 @@
msgid ""
" sa.sin_family = AF_INET;\n"
" sa.sin_port = htons(13);\n"
-" sa.sin_addr.s_addr = htonl((((((192 << 8) | 43) << 8) | 244) << 8) | 18);\n"
+" sa.sin_addr.s_addr = htonl((((((132 << 8) | 163) << 8) | 96) << 8) | 1);\n"
" if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {\n"
" perror(\"connect\");\n"
" close(s);\n"
@@ -1609,7 +1611,7 @@
msgstr ""
" sa.sin_family = AF_INET;\n"
" sa.sin_port = htons(13);\n"
-" sa.sin_addr.s_addr = htonl((((((192 << 8) | 43) << 8) | 244) << 8) | 18);\n"
+" sa.sin_addr.s_addr = htonl((((((132 << 8) | 163) << 8) | 96) << 8) | 1);\n"
" if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {\n"
" perror(\"connect\");\n"
" close(s);\n"
@@ -1842,7 +1844,7 @@
msgstr ""
"После того как вы услышите телефонный звонок, вы принимаете вызов, отвечая "
"на звонок. Теперь вы установили соединение с вашим клиентом. Это соединение "
-"остается активным, пока вы или ваш клиент не повесите трубку."
+"остаётся активным, пока вы или ваш клиент не повесите трубку."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:672
@@ -1882,8 +1884,8 @@
"What happens to the old socket? It continues to listen for more requests "
"(remember the `backlog` variable we passed to `listen`?) until we `close` it."
msgstr ""
-"Что происходит со старым сокетом? Он продолжает ожидать новые запросы ("
-"помните переменную `backlog`, которую мы передали в `listen`?), пока мы не "
+"Что происходит со старым сокетом? Он продолжает ожидать новые запросы "
+"(помните переменную `backlog`, которую мы передали в `listen`?), пока мы не "
"закроем его (`close`)."
#. type: Plain text
@@ -1921,8 +1923,8 @@
"program invoked it)."
msgstr ""
"Это лучше всего достигается созданием _дочернего процесса_ после привязки "
-"порта. Затем основной процесс завершается и возвращает управление оболочке ("
-"или любой другой программе, которая его вызвала)."
+"порта. Затем основной процесс завершается и возвращает управление оболочке "
+"(или любой другой программе, которая его вызвала)."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:701
@@ -2144,8 +2146,7 @@
" tm->tm_sec);\n"
msgstr ""
" tm = gmtime(&t);\n"
-" fprintf(client, \"%.4i-%.2i-%.2iT%.2i:%.2i:%.2iZ\\n"
-"\",\n"
+" fprintf(client, \"%.4i-%.2i-%.2iT%.2i:%.2i:%.2iZ\\n\",\n"
" tm->tm_year + 1900,\n"
" tm->tm_mon + 1,\n"
" tm->tm_mday,\n"
@@ -2187,20 +2188,20 @@
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:806
msgid ""
-"Its value is `0`. Since we have just used `bzero` on the entire structure, "
-"it would be redundant to set it to `0` again. But if we port our code to "
-"some other system where INADDR_ANY is perhaps not a zero, we need to assign "
-"it to `sa.sin_addr.s_addr`. Most modern C compilers are clever enough to "
-"notice that INADDR_ANY is a constant. As long as it is a zero, they will "
-"optimize the entire conditional statement out of the code."
+"Its value is `0`. Since we have just used `memset` to set zeroes on the "
+"entire structure, it would be redundant to set it to `0` again. But if we "
+"port our code to some other system where INADDR_ANY is perhaps not a zero, "
+"we need to assign it to `sa.sin_addr.s_addr`. Most modern C compilers are "
+"clever enough to notice that INADDR_ANY is a constant. As long as it is a "
+"zero, they will optimize the entire conditional statement out of the code."
msgstr ""
-"Его значение равно `0`. Поскольку мы только что использовали `bzero` для "
-"всей структуры, будет избыточным снова устанавливать его в `0`. Но если мы "
-"перенесем наш код на другую систему, где INADDR_ANY, возможно, не равен "
-"нулю, нам нужно будет присвоить его `sa.sin_addr.s_addr`. Большинство "
-"современных компиляторов C достаточно умны, чтобы заметить, что INADDR_ANY — "
-"это константа. Пока она равна нулю, они оптимизируют все условное выражение "
-"из кода."
+"Его значение равно `0`. Поскольку мы только что использовали `memset`, чтобы "
+"установить в 0 все байты структуры, будет избыточным снова устанавливать его "
+"в `0`. Но если мы перенесём наш код на другую систему, где INADDR_ANY, "
+"возможно, не равен нулю, нам нужно будет присвоить его `sa.sin_addr.s_addr`. "
+"Большинство современных компиляторов C достаточно умны, чтобы заметить, что "
+"INADDR_ANY — это константа. Пока она равна нулю, они оптимизируют все "
+"условное выражение из кода."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:810
@@ -2369,8 +2370,8 @@
"customary to end the names of daemons with the letter `d`). After you have "
"compiled it, try running it:"
msgstr ""
-"Теперь сохраните приведённый исходный код в файл [.filename]#daytimed.c# ("
-"обычно имена демонов оканчиваются буквой `d`). После компиляции попробуйте "
+"Теперь сохраните приведённый исходный код в файл [.filename]#daytimed.c# "
+"(обычно имена демонов оканчиваются буквой `d`). После компиляции попробуйте "
"запустить его:"
#. type: delimited block . 4
@@ -2416,7 +2417,7 @@
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:872
msgid "What... Nothing? Let us try again:"
-msgstr "Что... Ничего? Давайте попробуем еще раз:"
+msgstr "Что... Ничего? Давайте попробуем ещё раз:"
#. type: delimited block . 4
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:876
@@ -2598,7 +2599,7 @@
"even the domain name."
msgstr ""
"Библиотека C в FreeBSD содержит множество вспомогательных функций для "
-"программирования сокетов. Например, в нашем примере клиента мы жестко "
+"программирования сокетов. Например, в нашем примере клиента мы жёстко "
"прописали IP-адрес `time.nist.gov`. Но мы не всегда знаем IP-адрес. Даже "
"если знаем, наше программное обеспечение будет более гибким, если позволит "
"пользователю ввести IP-адрес или даже доменное имя."
@@ -2613,13 +2614,12 @@
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:954
msgid ""
"While there is no way to pass the domain name directly to any of the sockets "
-"functions, the FreeBSD C library comes with the man:gethostbyname[3] and "
-"man:gethostbyname2[3] functions, declared in [.filename]#netdb.h#."
+"functions, the FreeBSD C library comes with the man:gethostbyname[3] and man:"
+"gethostbyname2[3] functions, declared in [.filename]#netdb.h#."
msgstr ""
"Хотя нет возможности передать имя домена напрямую в какие-либо функции "
-"сокетов, стандартная библиотека C в FreeBSD предоставляет функции "
-"man:gethostbyname[3] и man:gethostbyname2[3], объявленные в [.filename]#netdb"
-".h#."
+"сокетов, стандартная библиотека C в FreeBSD предоставляет функции man:"
+"gethostbyname[3] и man:gethostbyname2[3], объявленные в [.filename]#netdb.h#."
#. type: delimited block . 4
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:959
@@ -2769,24 +2769,24 @@
"We now can type a domain name (or an IP address, it works both ways) on the "
"command line, and the program will try to connect to its _daytime_ server. "
"Otherwise, it will still default to `time.nist.gov`. However, even in this "
-"case we will use `gethostbyname` rather than hard coding `192.43.244.18`. "
+"case we will use `gethostbyname` rather than hard coding `132.163.96.1`. "
"That way, even if its IP address changes in the future, we will still find "
"it."
msgstr ""
"Теперь мы можем ввести доменное имя (или IP-адрес, это работает в обоих "
"направлениях) в командной строке, и программа попытается подключиться к его "
-"серверу _daytime_. В противном случае, по умолчанию будет использоваться "
-"`time.nist.gov`. Однако даже в этом случае мы будем использовать "
-"`gethostbyname` вместо жесткого задания `192.43.244.18`. Таким образом, даже "
-"если его IP-адрес изменится в будущем, мы всё равно сможем его найти."
+"серверу _daytime_. В противном случае по умолчанию будет использоваться `time"
+".nist.gov`. Однако даже в этом случае мы будем использовать `gethostbyname` "
+"вместо жёсткого указания `132.163.96.1`. Таким образом, даже если его IP-"
+"адрес изменится в будущем, мы всё равно сможем его найти."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1029
msgid ""
"Since it takes virtually no time to get the time from your local server, you "
-"could run daytime twice in a row: First to get the time from "
-"`time.nist.gov`, the second time from your own system. You can then compare "
-"the results and see how exact your system clock is:"
+"could run daytime twice in a row: First to get the time from `time.nist."
+"gov`, the second time from your own system. You can then compare the "
+"results and see how exact your system clock is:"
msgstr ""
"Поскольку получение времени от локального сервера занимает практически "
"нулевое время, вы можете запустить daytime дважды подряд: сначала для "
@@ -2826,9 +2826,9 @@
#. type: Plain text
#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1046
msgid ""
-"Sometimes you may not be sure what port a certain service uses. The "
-"man:getservbyname[3] function, also declared in [.filename]#netdb.h# comes "
-"in very handy in those cases:"
+"Sometimes you may not be sure what port a certain service uses. The man:"
+"getservbyname[3] function, also declared in [.filename]#netdb.h# comes in "
+"very handy in those cases:"
msgstr ""
"Иногда вы можете быть не уверены, какой порт использует определённая служба. "
"В таких случаях очень полезна функция man:getservbyname[3], также "
@@ -2873,8 +2873,7 @@
"struct servent *se;\n"
" ...\n"
" if ((se = getservbyname(\"daytime\", \"tcp\")) == NULL {\n"
-" fprintf(stderr, \"Cannot determine which port to use.\\n"
-"\");\n"
+" fprintf(stderr, \"Cannot determine which port to use.\\n\");\n"
" return 7;\n"
" }\n"
" sa.sin_port = se->s_port;\n"
@@ -2945,8 +2944,8 @@
msgstr ""
"Мы переместили _службу_ из _демона_ в её собственный _серверный процесс_. "
"Однако, поскольку каждый дочерний процесс наследует все открытые файлы (а "
-"сокет обрабатывается так же, как файл), новый процесс наследует не только "
-"_\"принятый дескриптор\"_, т.е. сокет, возвращённый вызовом `accept`, но и "
+"сокет обрабатывается так же, как файл), новый процесс наследует не только _"
+"\"принятый дескриптор\"_, т.е. сокет, возвращённый вызовом `accept`, но и "
"_главный сокет_, т.е. тот, который был открыт главным процессом в самом "
"начале."
@@ -2984,11 +2983,11 @@
"no longer functional but still roaming around."
msgstr ""
"В UNIX(R) процесс на самом деле не _завершается_. Вместо этого он "
-"_возвращается_ к своему родителю. Обычно родительский процесс ``ждёт`` (wait)"
-" завершения своего дочернего процесса и получает возвращаемое значение. "
-"Однако наш _демон-процесс_ не может просто остановиться и ждать. Это бы "
-"свело на нет всю цель создания дополнительных процессов. Но если он никогда "
-"не выполняет `wait`, его дочерние процессы станут _зомби_ — более не "
+"_возвращается_ к своему родителю. Обычно родительский процесс ``ждёт`` "
+"(wait) завершения своего дочернего процесса и получает возвращаемое "
+"значение. Однако наш _демон-процесс_ не может просто остановиться и ждать. "
+"Это бы свело на нет всю цель создания дополнительных процессов. Но если он "
+"никогда не выполняет `wait`, его дочерние процессы станут _зомби_ — более не "
"функционирующими, но всё ещё бродящими вокруг."
#. type: Plain text
diff --git a/documentation/content/ru/books/developers-handbook/testing/_index.adoc b/documentation/content/ru/books/developers-handbook/testing/_index.adoc
--- a/documentation/content/ru/books/developers-handbook/testing/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/testing/_index.adoc
@@ -49,7 +49,7 @@
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
-Регрессионные тесты используются для проверки определенной части системы, чтобы убедиться, что она работает как ожидается, и для предотвращения повторного появления старых ошибок.
+Регрессионные тесты используются для проверки определённой части системы, чтобы убедиться, что она работает как ожидается, и для предотвращения повторного появления старых ошибок.
Инструменты для регрессионного тестирования FreeBSD можно найти в дереве исходных кодов FreeBSD в каталоге [.filename]#src/tools/regression#.
@@ -58,7 +58,7 @@
Этот раздел содержит рекомендации по проведению корректного бенчмарка низкоуровненых операций на FreeBSD или самой FreeBSD.
-Невозможно использовать все приведенные ниже рекомендации каждый раз, но чем больше их применяется, тем лучше способность теста выявлять небольшие различия.
+Невозможно использовать все приведённые ниже рекомендации каждый раз, но чем больше их применяется, тем лучше способность теста выявлять небольшие различия.
* Отключить APM и любые другие манипуляции с часами (ACPI ?).
* Запускайте тесты в однопользовательском режиме. Например, man:cron[8] и другие демоны только добавляют шум. Демон man:sshd[8] также может вызвать проблемы. Если требуется доступ по SSH во время тестирования, либо отключите перегенерацию ключа SSHv1, либо завершите родительский демон `sshd` во время тестов.
@@ -82,10 +82,10 @@
* Попытайтесь поддерживать температуру вокруг машины как можно более стабильной. Это влияет как на кварцевые резонаторы, так и на алгоритмы работы дисковых накопителей. Для получения действительно стабильных часов рассмотрите возможность использования стабилизированного тактового сигнала. Например, используйте OCXO + PLL и подавайте выходной сигнал в тактовые схемы вместо кварцевого резонатора на материнской плате. Для получения дополнительной информации по этому вопросу свяжитесь с {phk}.
* Выполните тест как минимум 3 раза, но лучше запустить более 20 раз как для кода "до", так и для кода "после". По возможности чередуйте запуски (т.е. не следует запускать 20 раз "до", а затем 20 раз "после"), это поможет выявить влияние окружения. Не чередуйте строго 1:1, а лучше 3:3, чтобы можно было обнаружить эффекты взаимодействия.
+
-Хороший шаблон: `bababa{bbbaaa}*`. Это дает подсказку после первых 1+1 прогонов (так что можно остановить тест, если всё идет совсем не так), стандартное отклонение после первых 3+3 (дает хорошее представление, стоит ли проводить длительный прогон), а также тренды и показатели взаимодействия позже.
+Хороший шаблон: `bababa{bbbaaa}*`. Это даёт подсказку после первых 1+1 прогонов (так что можно остановить тест, если всё идёт совсем не так), стандартное отклонение после первых 3+3 (дает хорошее представление, стоит ли проводить длительный прогон), а также тренды и показатели взаимодействия позже.
* Используйте man:ministat[1], чтобы определить, являются ли числа значимыми. Рекомендуется приобрести книгу "Cartoon guide to statistics" ISBN: 0062731025, особенно если вы забыли или никогда не изучали стандартное отклонение и t-критерий Стьюдента.
* Не используйте фоновый man:fsck[8], если тест не является бенчмарком фонового `fsck`. Также отключите `background_fsck` в [.filename]#/etc/rc.conf#, если бенчмарк не запускается как минимум через 60+«время работы ``fsck``» секунд после загрузки, так как man:rc[8] пробуждается и проверяет, нужно ли запускать `fsck` для каких-либо файловых систем, когда включен фоновый `fsck`. Аналогично, убедитесь, что нет оставшихся снимков, если только бенчмарк не является тестом со снимками.
-* Если тесты производительности показывают неожиданно низкие результаты, проверьте такие факторы, как высокий объем прерываний из неожиданного источника. Сообщалось, что некоторые версии ACPI могут "вести себя неправильно" и генерировать избыточные прерывания. Для диагностики необычных результатов тестов сделайте несколько снимков `vmstat -i` и поищите что-то необычное.
+* Если тесты производительности показывают неожиданно низкие результаты, проверьте такие факторы, как высокий объём прерываний из неожиданного источника. Сообщалось, что некоторые версии ACPI могут "вести себя неправильно" и генерировать избыточные прерывания. Для диагностики необычных результатов тестов сделайте несколько снимков `vmstat -i` и поищите что-то необычное.
* Будьте внимательны к параметрам оптимизации для ядра и пользовательского пространства, а также отладки. Легко упустить что-то и позже понять, что тест сравнивал не одно и то же.
* Никогда не проводите тестирование производительности с включёнными параметрами ядра `WITNESS` и `INVARIANTS`, если тест не направлен на оценку производительности именно этих функций. `WITNESS` может привести к снижению производительности на 400% и более. Аналогично, параметры userspace man:malloc[3] по умолчанию отличаются в -CURRENT от тех, что поставляются в релизах.
@@ -100,7 +100,7 @@
* Набора серверов сборки, которые постоянно тестируют последние изменения наиболее важных веток кода FreeBSD.
* Веб-сервера, хранящего полный набор журналов Tinderbox и отображающий актуальную сводку.
-Скрипты поддерживаются и были разработаны {des}, и сейчас написаны на Perl, что стало шагом вперед по сравнению с их первоначальной версией в виде shell-скриптов. Все скрипты и конфигурационные файлы хранятся в https://www.freebsd.org/cgi/cvsweb.cgi/projects/tinderbox/[/projects/tinderbox/].
+Скрипты поддерживаются и были разработаны {des}, и сейчас написаны на Perl, что стало шагом вперёд по сравнению с их первоначальной версией в виде shell-скриптов. Все скрипты и конфигурационные файлы хранятся в https://www.freebsd.org/cgi/cvsweb.cgi/projects/tinderbox/[/projects/tinderbox/].
Для получения дополнительной информации о скриптах tinderbox и tbmaster на данном этапе обратитесь к соответствующим руководствам: tinderbox(1) и tbmaster(1).
@@ -110,7 +110,7 @@
Скрипт начинает работу в блоке `main()`, пытаясь проверить, что он выполняется на официальном сайте Tinderbox. Если это не так, создается страница с указанием, что это не официальный сайт, и предоставляется URL официального сайта.
-Далее выполняется сканирование каталога журналов для получения перечня конфигураций, веток и архитектур, для которых существуют файлы журналов, чтобы избежать жесткого задания списка в скрипте и потенциального появления пустых строк или столбцов. Эта информация извлекается из имен файлов журналов, соответствующих следующему шаблону:
+Далее выполняется сканирование каталога журналов для получения перечня конфигураций, веток и архитектур, для которых существуют файлы журналов, чтобы избежать жёсткого задания списка в скрипте и потенциального появления пустых строк или столбцов. Эта информация извлекается из имён файлов журналов, соответствующих следующему шаблону:
[.programlisting]
....
diff --git a/documentation/content/ru/books/developers-handbook/testing/_index.po b/documentation/content/ru/books/developers-handbook/testing/_index.po
--- a/documentation/content/ru/books/developers-handbook/testing/_index.po
+++ b/documentation/content/ru/books/developers-handbook/testing/_index.po
@@ -1,12 +1,12 @@
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
-# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-05-01 19:56-0300\n"
-"PO-Revision-Date: 2025-11-12 04:45+0000\n"
+"PO-Revision-Date: 2026-03-04 20:01+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbooktesting_index/ru/>\n"
@@ -38,7 +38,7 @@
"check that it works as expected, and to make sure that old bugs are not "
"reintroduced."
msgstr ""
-"Регрессионные тесты используются для проверки определенной части системы, "
+"Регрессионные тесты используются для проверки определённой части системы, "
"чтобы убедиться, что она работает как ожидается, и для предотвращения "
"повторного появления старых ошибок."
@@ -73,7 +73,7 @@
"but the more used, the better the benchmark's ability to test small "
"differences will be."
msgstr ""
-"Невозможно использовать все приведенные ниже рекомендации каждый раз, но чем "
+"Невозможно использовать все приведённые ниже рекомендации каждый раз, но чем "
"больше их применяется, тем лучше способность теста выявлять небольшие "
"различия."
@@ -298,8 +298,8 @@
"a standard deviation after the first 3+3 (gives a good indication if it is "
"going to be worth a long run) and trending and interaction numbers later on."
msgstr ""
-"Хороший шаблон: `bababa{bbbaaa}*`. Это дает подсказку после первых 1+1 "
-"прогонов (так что можно остановить тест, если всё идет совсем не так), "
+"Хороший шаблон: `bababa{bbbaaa}*`. Это даёт подсказку после первых 1+1 "
+"прогонов (так что можно остановить тест, если всё идёт совсем не так), "
"стандартное отклонение после первых 3+3 (дает хорошее представление, стоит "
"ли проводить длительный прогон), а также тренды и показатели взаимодействия "
"позже."
@@ -345,7 +345,7 @@
"unusual."
msgstr ""
"Если тесты производительности показывают неожиданно низкие результаты, "
-"проверьте такие факторы, как высокий объем прерываний из неожиданного "
+"проверьте такие факторы, как высокий объём прерываний из неожиданного "
"источника. Сообщалось, что некоторые версии ACPI могут \"вести себя "
"неправильно\" и генерировать избыточные прерывания. Для диагностики "
"необычных результатов тестов сделайте несколько снимков `vmstat -i` и "
@@ -444,7 +444,7 @@
"cvsweb.cgi/projects/tinderbox/[/projects/tinderbox/]."
msgstr ""
"Скрипты поддерживаются и были разработаны {des}, и сейчас написаны на Perl, "
-"что стало шагом вперед по сравнению с их первоначальной версией в виде shell-"
+"что стало шагом вперёд по сравнению с их первоначальной версией в виде shell-"
"скриптов. Все скрипты и конфигурационные файлы хранятся в https://www.freebsd"
".org/cgi/cvsweb.cgi/projects/tinderbox/[/projects/tinderbox/]."
@@ -507,8 +507,8 @@
msgstr ""
"Далее выполняется сканирование каталога журналов для получения перечня "
"конфигураций, веток и архитектур, для которых существуют файлы журналов, "
-"чтобы избежать жесткого задания списка в скрипте и потенциального появления "
-"пустых строк или столбцов. Эта информация извлекается из имен файлов "
+"чтобы избежать жёсткого задания списка в скрипте и потенциального появления "
+"пустых строк или столбцов. Эта информация извлекается из имён файлов "
"журналов, соответствующих следующему шаблону:"
#. type: delimited block . 4
diff --git a/documentation/content/ru/books/developers-handbook/tools/_index.adoc b/documentation/content/ru/books/developers-handbook/tools/_index.adoc
--- a/documentation/content/ru/books/developers-handbook/tools/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/tools/_index.adoc
@@ -147,7 +147,7 @@
. Обработать исходный код, чтобы удалить комментарии и выполнить другие действия, такие как раскрытие макросов в C.
. Проверить синтаксис вашего кода, чтобы убедиться, что вы соблюдаете правила языка. Если нет, он пожалуется!
. Преобразовать исходный код в ассемблерный язык — это очень близко к машинному коду, но всё ещё понятно человеку. Как утверждается.
-. Преобразовать язык ассемблера в машинный код — да, здесь речь идет о битах и байтах, единицах и нулях.
+. Преобразовать язык ассемблера в машинный код — да, здесь речь идёт о битах и байтах, единицах и нулях.
. Проверить, что вы использовали такие элементы, как функции и глобальные переменные, правильно и последовательно. Например, если вы вызвали несуществующую функцию, это будет отмечено.
. Если вы пытаетесь создать исполняемый файл из нескольких исходных файлов, определить, как объединить их все вместе.
. Определить, как создать что-то, что загрузчик времени выполнения системы сможет загрузить в память и запустить.
@@ -201,7 +201,7 @@
% cc -g foobar.c
....
+
-Это создаст отладочную версию программы. footnote:[Примечание: мы не использовали флаг -o для указания имени исполняемого файла, поэтому получим исполняемый файл с именем a.out. Создание отладочной версии с именем foobar остается упражнением для читателя!]
+Это создаст отладочную версию программы. footnote:[Примечание: мы не использовали флаг -o для указания имени исполняемого файла, поэтому получим исполняемый файл с именем a.out. Создание отладочной версии с именем foobar остаётся упражнением для читателя!]
`-O`::
Создает оптимизированную версию исполняемого файла. Компилятор применяет различные хитрые приёмы, чтобы попытаться создать исполняемый файл, который работает быстрее обычного. Вы можете добавить число после `-O`, чтобы указать более высокий уровень оптимизации, но это часто выявляет ошибки в оптимизаторе компилятора.
diff --git a/documentation/content/ru/books/developers-handbook/tools/_index.po b/documentation/content/ru/books/developers-handbook/tools/_index.po
--- a/documentation/content/ru/books/developers-handbook/tools/_index.po
+++ b/documentation/content/ru/books/developers-handbook/tools/_index.po
@@ -1,12 +1,12 @@
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
-# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-11-08 16:17+0000\n"
-"PO-Revision-Date: 2025-11-12 04:45+0000\n"
+"PO-Revision-Date: 2026-03-08 09:11+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbooktools_index/ru/>\n"
@@ -596,7 +596,7 @@
"Convert the assembly language into machine code-yep, we are talking bits and "
"bytes, ones and zeros here."
msgstr ""
-"Преобразовать язык ассемблера в машинный код — да, здесь речь идет о битах и "
+"Преобразовать язык ассемблера в машинный код — да, здесь речь идёт о битах и "
"байтах, единицах и нулях."
#. type: Plain text
@@ -807,7 +807,7 @@
"Это создаст отладочную версию программы. footnote:[Примечание: мы не "
"использовали флаг -o для указания имени исполняемого файла, поэтому получим "
"исполняемый файл с именем a.out. Создание отладочной версии с именем foobar "
-"остается упражнением для читателя!]"
+"остаётся упражнением для читателя!]"
#. type: Labeled list
#: documentation/content/en/books/developers-handbook/tools/_index.adoc:267
diff --git a/documentation/content/ru/books/developers-handbook/x86/_index.adoc b/documentation/content/ru/books/developers-handbook/x86/_index.adoc
--- a/documentation/content/ru/books/developers-handbook/x86/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/x86/_index.adoc
@@ -138,7 +138,7 @@
FreeBSD — это чрезвычайно гибкая система. Она предлагает другие способы вызова ядра. Однако для работы необходимо, чтобы в системе была установлена эмуляция Linux.
-Linux — это система, подобная UNIX(R). Однако ее ядро использует то же соглашение о системных вызовов для передачи параметров в регистрах, что и MS-DOS(R). Как и в соглашении UNIX(R), номер функции помещается в `EAX`. Однако параметры передаются не в стеке, а в регистрах `EBX, ECX, EDX, ESI, EDI, EBP`:
+Linux — это система, подобная UNIX(R). Однако её ядро использует то же соглашение о системных вызовов для передачи параметров в регистрах, что и MS-DOS(R). Как и в соглашении UNIX(R), номер функции помещается в `EAX`. Однако параметры передаются не в стеке, а в регистрах `EBX, ECX, EDX, ESI, EDI, EBP`:
[.programlisting]
....
@@ -234,7 +234,7 @@
[NOTE]
====
-Я знаю о одном системном вызове, который возвращает значение в `EDX`: `SYS_fork`. Все остальные, с которыми я работал, используют `EAX`. Но я еще не работал со всеми из них.
+Я знаю о одном системном вызове, который возвращает значение в `EDX`: `SYS_fork`. Все остальные, с которыми я работал, используют `EAX`. Но я ещё не работал со всеми из них.
====
[TIP]
@@ -263,7 +263,7 @@
Портативность обычно не является сильной стороной языка ассемблера. Тем не менее, написание программ на ассемблере для разных платформ возможно, особенно с использованием nasm. Я создавал библиотеки на ассемблере, которые можно было собрать для таких разных операционных систем, как Windows(R) и FreeBSD.
-Это становится еще более возможным, когда вы хотите, чтобы ваш код работал на двух платформах, которые, хотя и различны, основаны на схожих архитектурах.
+Это становится ещё более возможным, когда вы хотите, чтобы ваш код работал на двух платформах, которые, хотя и различны, основаны на схожих архитектурах.
Например, FreeBSD — это UNIX(R), а Linux — UNIX(R)-подобная система. Я упомянул лишь три различия между ними (с точки зрения программиста на ассемблере): соглашение о вызовах, номера функций и способ возврата значений.
@@ -395,7 +395,7 @@
Если вы выпускаете своё программное обеспечение в виде исходного кода (или вместе с ним), вы можете использовать макросы и размещать их в отдельном файле, который включается в ваш код.
-Портеры вашего программного обеспечения просто напишут новый include-файл. Никакая библиотека или внешний объектный файл не требуются, и ваш код остается переносимым без необходимости редактирования.
+Портеры вашего программного обеспечения просто напишут новый include-файл. Никакая библиотека или внешний объектный файл не требуются, и ваш код остаётся переносимым без необходимости редактирования.
[NOTE]
====
@@ -601,7 +601,7 @@
В разделе данных мы создаем массив с именем `hex`. Он содержит 16 шестнадцатеричных цифр в порядке возрастания. За массивом следует буфер, который мы будем использовать как для ввода, так и для вывода. Первые два байта буфера изначально установлены в `0`. Именно сюда мы будем записывать две шестнадцатеричные цифры (первый байт также является местом, откуда мы будем считывать ввод). Третий байт — это пробел.
-Фрагмент кода состоит из четырех частей: чтение байта, преобразование его в шестнадцатеричное число, запись результата и завершение программы.
+Фрагмент кода состоит из четырёх частей: чтение байта, преобразование его в шестнадцатеричное число, запись результата и завершение программы.
Для чтения байта мы просим систему прочитать один байт из [.filename]#stdin# и сохранить его в первом байте `buffer`. Система возвращает количество прочитанных байтов в `EAX`. Это значение будет `1`, пока поступают данные, или `0`, если больше нет доступных входных данных. Поэтому мы проверяем значение `EAX`. Если оно равно `0`, мы переходим к метке `.done`, в противном случае продолжаем выполнение.
@@ -610,7 +610,7 @@
Для простоты мы пока игнорируем возможность возникновения ошибки.
====
-Шестнадцатеричное преобразование считывает байт из `buffer` в `EAX`, а точнее только в `AL`, обнуляя остальные биты `EAX`. Мы также копируем байт в `EDX`, потому что нам нужно преобразовать верхние четыре бита (ниббл) отдельно от нижних четырех битов. Результат сохраняется в первых двух байтах буфера.
+Шестнадцатеричное преобразование считывает байт из `buffer` в `EAX`, а точнее только в `AL`, обнуляя остальные биты `EAX`. Мы также копируем байт в `EDX`, потому что нам нужно преобразовать верхние четыре бита (ниббл) отдельно от нижних четырёх битов. Результат сохраняется в первых двух байтах буфера.
Далее мы просим систему записать три байта буфера, то есть две шестнадцатеричные цифры и пробел, в [.filename]#stdout#. Затем мы возвращаемся к началу программы и обрабатываем следующий байт.
@@ -712,7 +712,7 @@
Мы можем повысить эффективность нашего кода, буферизуя ввод и вывод. Мы создаём входной буфер и читаем сразу целую последовательность байтов. Затем мы извлекаем их по одному из буфера.
-Мы также создаем выходной буфер. Мы сохраняем наш вывод в нем, пока он не заполнится. В этот момент мы просим ядро записать содержимое буфера в [.filename]#stdout#.
+Мы также создаем выходной буфер. Мы сохраняем наш вывод в нём, пока он не заполнится. В этот момент мы просим ядро записать содержимое буфера в [.filename]#stdout#.
Программа завершается, когда больше нет входных данных. Но нам всё ещё нужно попросить ядро записать содержимое нашего выходного буфера в [.filename]#stdout# в последний раз, иначе часть нашего вывода попадёт в буфер, но так и не будет отправлена. Не забудьте об этом, иначе будете недоумевать, куда пропала часть вывода.
@@ -986,7 +986,7 @@
inc esi
....
-Байт, который мы извлекли, остается в буфере до следующего вызова `read`. Мы не знаем, когда это произойдет, но знаем, что этого не случится до следующего вызова `getchar`. Следовательно, чтобы "вернуть" последний прочитанный байт обратно в поток, нам достаточно уменьшить значение `ESI` и увеличить значение `EBX`:
+Байт, который мы извлекли, остаётся в буфере до следующего вызова `read`. Мы не знаем, когда это произойдет, но знаем, что этого не случится до следующего вызова `getchar`. Следовательно, чтобы "вернуть" последний прочитанный байт обратно в поток, нам достаточно уменьшить значение `ESI` и увеличить значение `EBX`:
[.programlisting]
....
@@ -996,15 +996,15 @@
ret
....
-Но будьте осторожны! Мы в полной безопасности, если заглядываем вперед только на один символ за раз. Если же мы проверяем несколько следующих символов и вызываем `ungetc` несколько раз подряд, это будет работать в большинстве случаев, но не всегда (и ошибки будет сложно отладить). Почему?
+Но будьте осторожны! Мы в полной безопасности, если заглядываем вперёд только на один символ за раз. Если же мы проверяем несколько следующих символов и вызываем `ungetc` несколько раз подряд, это будет работать в большинстве случаев, но не всегда (и ошибки будет сложно отладить). Почему?
Потому что пока `getchar` не вызывает `read`, все предварительно прочитанные байты остаются в буфере, и наш `ungetc` работает без сбоев. Но как только `getchar` вызывает `read`, содержимое буфера изменяется.
Мы всегда можем рассчитывать на корректную работу `ungetc` с последним символом, прочитанным через `getchar`, но не с любым символом, прочитанным до этого.
-Если ваша программа читает более одного байта вперед, у вас есть как минимум два варианта:
+Если ваша программа читает более одного байта вперёд, у вас есть как минимум два варианта:
-Если возможно, измените программу так, чтобы она читала только один байт вперед. Это самое простое решение.
+Если возможно, измените программу так, чтобы она читала только один байт вперёд. Это самое простое решение.
Если эта опция недоступна, сначала определите максимальное количество символов, которое вашей программе может потребоваться вернуть во входной поток за один раз. Увеличьте это число немного, чтобы быть уверенным, предпочтительно до кратного 16 — так оно будет лучше выровнено. Затем измените секцию `.bss` в вашем коде и создайте небольшой "запасной" буфер прямо перед вашим входным буфером, примерно так:
@@ -1230,11 +1230,11 @@
Если всё прошло успешно, мы проверяем второй аргумент. Если он присутствует, мы открываем выходной файл. В противном случае, мы отправляем вывод в `stdout`. Если нам не удаётся открыть выходной файл (например, он существует и у нас нет прав на запись), мы снова переходим к обработчику ошибок.
-Остальная часть кода остается прежней, за исключением того, что мы закрываем входной и выходной файлы перед завершением, и, как упоминалось, используем `[fd.in]` и `[fd.out]`.
+Остальная часть кода остаётся прежней, за исключением того, что мы закрываем входной и выходной файлы перед завершением, и, как упоминалось, используем `[fd.in]` и `[fd.out]`.
Наш исполняемый файл теперь имеет внушительный размер в 768 байт.
-Можем ли мы улучшить его еще? Конечно! Каждую программу можно улучшить. Вот несколько идей, что мы могли бы сделать:
+Можем ли мы улучшить его ещё? Конечно! Каждую программу можно улучшить. Вот несколько идей, что мы могли бы сделать:
* Сделать наш обработчик ошибок, выводящий сообщение в `stderr`.
* Добавить обработчики ошибок в функции `read` и `write`.
@@ -1617,7 +1617,7 @@
call ebx
....
-Это возможно быстрее, чем жестко задавать адрес в коде, потому что микропроцессору не нужно извлекать адрес из памяти — он уже хранится в одном из его регистров. Я сказал _возможно_, потому что с учетом кэширования, которое выполняют современные микропроцессоры, оба варианта могут быть одинаково быстрыми.
+Это возможно быстрее, чем жёстко задавать адрес в коде, потому что микропроцессору не нужно извлекать адрес из памяти — он уже хранится в одном из его регистров. Я сказал _возможно_, потому что с учётом кэширования, которое выполняют современные микропроцессоры, оба варианта могут быть одинаково быстрыми.
[[memory-mapped-files]]
=== Отображенные в память файлы
@@ -2047,7 +2047,7 @@
* Она отображает подсказку, если обнаруживает неверные аргументы;
* Она выдает понятные сообщения об ошибках.
-Вот какое сообщение она выводит о том, как ее использовать:
+Вот какое сообщение она выводит о том, как её использовать:
[source, shell]
....
@@ -2363,7 +2363,7 @@
Это изменение предотвращает загадочную блокировку в очень специфическом случае. Я называю это _тёмной стороной буферизации_, в основном потому, что это представляет опасность, которая не совсем очевидна.
-Маловероятно, что это произойдет с такой программой, как csv выше, поэтому рассмотрим еще один фильтр: в этом случае мы ожидаем, что наши входные данные будут представлять собой необработанные данные, описывающие значения цветов, такие как интенсивности _красного_, _зеленого_ и _синего_ для пикселя. На выходе мы получим негатив входных данных.
+Маловероятно, что это произойдет с такой программой, как csv выше, поэтому рассмотрим ещё один фильтр: в этом случае мы ожидаем, что наши входные данные будут представлять собой необработанные данные, описывающие значения цветов, такие как интенсивности _красного_, _зеленого_ и _синего_ для пикселя. На выходе мы получим негатив входных данных.
Такой фильтр было бы очень просто написать. Большая его часть выглядела бы так же, как и все другие фильтры, которые мы уже писали, поэтому я покажу только его внутренний цикл:
@@ -2732,7 +2732,7 @@
Остается одна непокрытая возможность: если пользователь вводит только ноль (или несколько нулей), мы никогда не найдем ненулевое значение для отображения.
-Мы можем определить, что это произошло, когда наш счетчик остается на `0`. В этом случае нам нужно отправить `0` на выход и выполнить еще один "удар по лицу":
+Мы можем определить, что это произошло, когда наш счетчик остаётся на `0`. В этом случае нам нужно отправить `0` на выход и выполнить ещё один "удар по лицу":
[source, shell]
....
@@ -2743,7 +2743,7 @@
Не случайно слово _булавочное ушко_ содержит слово _булавка_. Действительно, многие малые отверстия буквально являются _дырками от булавки_ — отверстиями, аккуратно проделанными остриём булавки.
-Вот потому что типичное отверстие очень маленькое. Наша формула дает результат в миллиметрах. Мы умножим его на `1000`, чтобы вывести результат в _микронах_.
+Вот потому что типичное отверстие очень маленькое. Наша формула даёт результат в миллиметрах. Мы умножим его на `1000`, чтобы вывести результат в _микронах_.
На этом этапе нас ожидает ещё одна ловушка: _Излишняя точность._
@@ -2755,12 +2755,12 @@
[NOTE]
====
-Я "всего лишь" использовал десять цифр в приведенном выше примере. Представьте абсурдность попытки использовать все 18!
+Я "всего лишь" использовал десять цифр в приведённом выше примере. Представьте абсурдность попытки использовать все 18!
====
Нам нужно ограничить количество значащих цифр в нашем результате. Один из способов сделать это — использовать целое число, представляющее микроны. Таким образом, нашему грузовику потребуется отверстие диаметром `4382` микрона. Глядя на это число, мы всё же решаем, что `4400` микрон, или `4.4` миллиметра, достаточно близко.
-Кроме того, мы можем решить, что независимо от размера результата, мы хотим отображать только четыре значащих цифры (или любое другое их количество, конечно). Увы, FPU не поддерживает округление до определенного количества цифр (в конце концов, он воспринимает числа не как десятичные, а как двоичные).
+Кроме того, мы можем решить, что независимо от размера результата, мы хотим отображать только четыре значащих цифры (или любое другое их количество, конечно). Увы, FPU не поддерживает округление до определённого количества цифр (в конце концов, он воспринимает числа не как десятичные, а как двоичные).
Следовательно, мы должны разработать алгоритм для уменьшения количества значащих цифр.
@@ -2846,7 +2846,7 @@
Предположим, наше число диафрагмы на 5 ступеней отличается от f5.6, а экспонометр показывает, что нужно использовать выдержку 1/1000 сек. Тогда мы можем сначала установить выдержку на 1/1000, а затем повернуть диск на 5 ступеней.
-Этот расчет также довольно прост. Все, что нам нужно сделать, это вычислить логарифм по основанию 2 от множителя f5.6, который мы только что рассчитали (хотя нам нужно его значение до округления). Затем мы выводим результат, округленный до ближайшего целого числа. Нам не нужно беспокоиться о наличии более четырех значащих цифр в этом случае: скорее всего, результат будет содержать только одну или две цифры.
+Этот расчет также довольно прост. Все, что нам нужно сделать, это вычислить логарифм по основанию 2 от множителя f5.6, который мы только что рассчитали (хотя нам нужно его значение до округления). Затем мы выводим результат, округленный до ближайшего целого числа. Нам не нужно беспокоиться о наличии более четырёх значащих цифр в этом случае: скорее всего, результат будет содержать только одну или две цифры.
[[x86-fpu-optimizations]]
=== Оптимизации FPU
@@ -2871,7 +2871,7 @@
Итак, при программировании FPU на языке ассемблера ищите способы хранения промежуточных результатов в стеке FPU.
-Мы можем развить эту идею еще дальше! В нашей программе мы используем _константу_ (ту, которую назвали `PC`).
+Мы можем развить эту идею ещё дальше! В нашей программе мы используем _константу_ (ту, которую назвали `PC`).
Не имеет значения, сколько диаметров отверстий мы рассчитываем: 1, 10, 20, 1000, мы всегда используем одну и ту же константу. Следовательно, мы можем оптимизировать нашу программу, сохраняя константу в стеке всё время.
@@ -3769,7 +3769,7 @@
% /usr/local/bin/pinhole -b -i ./medium -c
....
-Это дает ему два конфликтующих параметра: `-b` и `-c` (Использовать константу Бендера и использовать константу Коннорса). Мы запрограммировали его так, что более поздние параметры переопределяют ранние — наша программа будет вычислять все, используя константу Коннорса:
+Это даёт ему два конфликтующих параметра: `-b` и `-c` (Использовать константу Бендера и использовать константу Коннорса). Мы запрограммировали его так, что более поздние параметры переопределяют ранние — наша программа будет вычислять все, используя константу Коннорса:
[source, shell]
....
@@ -3837,7 +3837,7 @@
Если вы написали program2, ваш ввод поступает не с клавиатуры, а из вывода program1. Аналогично, ваш вывод не выводится на экран, а становится вводом для program3, чей вывод, в свою очередь, отправляется в [.filename]#file1#.
-Но это еще не все! Даже если вы убедились, что ваш ввод поступает с терминала, а вывод отправляется на терминал, нет гарантии, что терминал является ПК: его видеопамять может находиться не там, где вы ожидаете, а клавиатура может генерировать не PC-совместимые скан-коды. Это может быть Macintosh(R) или любой другой компьютер.
+Но это ещё не все! Даже если вы убедились, что ваш ввод поступает с терминала, а вывод отправляется на терминал, нет гарантии, что терминал является ПК: его видеопамять может находиться не там, где вы ожидаете, а клавиатура может генерировать не PC-совместимые скан-коды. Это может быть Macintosh(R) или любой другой компьютер.
Вот вы, возможно, покачаете головой: мое программное обеспечение написано на языке ассемблера для ПК, как оно может работать на Macintosh(R)? Но я не говорил, что ваше программное обеспечение будет работать на Macintosh(R), а лишь что его терминалом может быть Macintosh(R).
diff --git a/documentation/content/ru/books/developers-handbook/x86/_index.po b/documentation/content/ru/books/developers-handbook/x86/_index.po
--- a/documentation/content/ru/books/developers-handbook/x86/_index.po
+++ b/documentation/content/ru/books/developers-handbook/x86/_index.po
@@ -1,12 +1,12 @@
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
-# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-11-08 16:17+0000\n"
-"PO-Revision-Date: 2025-11-11 04:45+0000\n"
+"PO-Revision-Date: 2026-03-04 20:01+0000\n"
"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksdevelopers-handbookx86_index/ru/>\n"
@@ -353,7 +353,7 @@
"parameters, however, are not passed on the stack but in `EBX, ECX, EDX, ESI, "
"EDI, EBP`:"
msgstr ""
-"Linux — это система, подобная UNIX(R). Однако ее ядро использует то же "
+"Linux — это система, подобная UNIX(R). Однако её ядро использует то же "
"соглашение о системных вызовов для передачи параметров в регистрах, что и MS-"
"DOS(R). Как и в соглашении UNIX(R), номер функции помещается в `EAX`. Однако "
"параметры передаются не в стеке, а в регистрах `EBX, ECX, EDX, ESI, EDI, "
@@ -654,7 +654,7 @@
"all yet."
msgstr ""
"Я знаю о одном системном вызове, который возвращает значение в `EDX`: "
-"`SYS_fork`. Все остальные, с которыми я работал, используют `EAX`. Но я еще "
+"`SYS_fork`. Все остальные, с которыми я работал, используют `EAX`. Но я ещё "
"не работал со всеми из них."
#. type: delimited block = 4
@@ -751,7 +751,7 @@
"It is all the more possible when you want your code to run on two platforms "
"which, while different, are based on similar architectures."
msgstr ""
-"Это становится еще более возможным, когда вы хотите, чтобы ваш код работал "
+"Это становится ещё более возможным, когда вы хотите, чтобы ваш код работал "
"на двух платформах, которые, хотя и различны, основаны на схожих "
"архитектурах."
@@ -1154,7 +1154,7 @@
msgstr ""
"Портеры вашего программного обеспечения просто напишут новый include-файл. "
"Никакая библиотека или внешний объектный файл не требуются, и ваш код "
-"остается переносимым без необходимости редактирования."
+"остаётся переносимым без необходимости редактирования."
#. type: delimited block = 4
#: documentation/content/en/books/developers-handbook/x86/_index.adoc:467
@@ -1716,7 +1716,7 @@
"The code section consists of four parts: Reading the byte, converting it to "
"a hexadecimal number, writing the result, and eventually exiting the program."
msgstr ""
-"Фрагмент кода состоит из четырех частей: чтение байта, преобразование его в "
+"Фрагмент кода состоит из четырёх частей: чтение байта, преобразование его в "
"шестнадцатеричное число, запись результата и завершение программы."
#. type: Plain text
@@ -1755,7 +1755,7 @@
"Шестнадцатеричное преобразование считывает байт из `buffer` в `EAX`, а "
"точнее только в `AL`, обнуляя остальные биты `EAX`. Мы также копируем байт в "
"`EDX`, потому что нам нужно преобразовать верхние четыре бита (ниббл) "
-"отдельно от нижних четырех битов. Результат сохраняется в первых двух байтах "
+"отдельно от нижних четырёх битов. Результат сохраняется в первых двух байтах "
"буфера."
#. type: Plain text
@@ -2020,7 +2020,7 @@
"full. At that time we ask the kernel to write the contents of the buffer to "
"[.filename]#stdout#."
msgstr ""
-"Мы также создаем выходной буфер. Мы сохраняем наш вывод в нем, пока он не "
+"Мы также создаем выходной буфер. Мы сохраняем наш вывод в нём, пока он не "
"заполнится. В этот момент мы просим ядро записать содержимое буфера в [."
"filename]#stdout#."
@@ -2572,7 +2572,7 @@
"back to the stream, all we have to do is decrease the value of `ESI` and "
"increase the value of `EBX`:"
msgstr ""
-"Байт, который мы извлекли, остается в буфере до следующего вызова `read`. Мы "
+"Байт, который мы извлекли, остаётся в буфере до следующего вызова `read`. Мы "
"не знаем, когда это произойдет, но знаем, что этого не случится до "
"следующего вызова `getchar`. Следовательно, чтобы \"вернуть\" последний "
"прочитанный байт обратно в поток, нам достаточно уменьшить значение `ESI` и "
@@ -2600,7 +2600,7 @@
"character and call `ungetc` several times in a row, it will work most of the "
"time, but not all the time (and will be tough to debug). Why?"
msgstr ""
-"Но будьте осторожны! Мы в полной безопасности, если заглядываем вперед "
+"Но будьте осторожны! Мы в полной безопасности, если заглядываем вперёд "
"только на один символ за раз. Если же мы проверяем несколько следующих "
"символов и вызываем `ungetc` несколько раз подряд, это будет работать в "
"большинстве случаев, но не всегда (и ошибки будет сложно отладить). Почему?"
@@ -2633,7 +2633,7 @@
"If your program reads more than one byte ahead, you have at least two "
"choices:"
msgstr ""
-"Если ваша программа читает более одного байта вперед, у вас есть как минимум "
+"Если ваша программа читает более одного байта вперёд, у вас есть как минимум "
"два варианта:"
#. type: Plain text
@@ -2643,7 +2643,7 @@
"the simplest solution."
msgstr ""
"Если возможно, измените программу так, чтобы она читала только один байт "
-"вперед. Это самое простое решение."
+"вперёд. Это самое простое решение."
#. type: Plain text
#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1142
@@ -3201,7 +3201,7 @@
"output files before exiting, and, as mentioned, we use `[fd.in]` and `[fd."
"out]`."
msgstr ""
-"Остальная часть кода остается прежней, за исключением того, что мы закрываем "
+"Остальная часть кода остаётся прежней, за исключением того, что мы закрываем "
"входной и выходной файлы перед завершением, и, как упоминалось, используем "
"`[fd.in]` и `[fd.out]`."
@@ -3216,7 +3216,7 @@
"Can we still improve it? Of course! Every program can be improved. Here are "
"a few ideas of what we could do:"
msgstr ""
-"Можем ли мы улучшить его еще? Конечно! Каждую программу можно улучшить. Вот "
+"Можем ли мы улучшить его ещё? Конечно! Каждую программу можно улучшить. Вот "
"несколько идей, что мы могли бы сделать:"
#. type: Plain text
@@ -4459,9 +4459,9 @@
"already stored in one of its registers. I said _possibly_ because with the "
"caching modern microprocessors do, either way may be equally fast."
msgstr ""
-"Это возможно быстрее, чем жестко задавать адрес в коде, потому что "
+"Это возможно быстрее, чем жёстко задавать адрес в коде, потому что "
"микропроцессору не нужно извлекать адрес из памяти — он уже хранится в одном "
-"из его регистров. Я сказал _возможно_, потому что с учетом кэширования, "
+"из его регистров. Я сказал _возможно_, потому что с учётом кэширования, "
"которое выполняют современные микропроцессоры, оба варианта могут быть "
"одинаково быстрыми."
@@ -5737,7 +5737,7 @@
#. type: Plain text
#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2286
msgid "Here is its usage message:"
-msgstr "Вот какое сообщение она выводит о том, как ее использовать:"
+msgstr "Вот какое сообщение она выводит о том, как её использовать:"
#. type: delimited block . 4
#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2290
@@ -6493,7 +6493,7 @@
"intensities of a pixel. Our output will be the negative of our input."
msgstr ""
"Маловероятно, что это произойдет с такой программой, как csv выше, поэтому "
-"рассмотрим еще один фильтр: в этом случае мы ожидаем, что наши входные "
+"рассмотрим ещё один фильтр: в этом случае мы ожидаем, что наши входные "
"данные будут представлять собой необработанные данные, описывающие значения "
"цветов, такие как интенсивности _красного_, _зеленого_ и _синего_ для "
"пикселя. На выходе мы получим негатив входных данных."
@@ -8006,8 +8006,8 @@
"that case we need to send `0` to the output, and perform another \"slap in "
"the face\":"
msgstr ""
-"Мы можем определить, что это произошло, когда наш счетчик остается на `0`. В "
-"этом случае нам нужно отправить `0` на выход и выполнить еще один \"удар по "
+"Мы можем определить, что это произошло, когда наш счетчик остаётся на `0`. В "
+"этом случае нам нужно отправить `0` на выход и выполнить ещё один \"удар по "
"лицу\":"
#. type: delimited block . 4
@@ -8043,7 +8043,7 @@
"in millimeters. We will multiply it by `1000`, so we can output the result "
"in _microns_."
msgstr ""
-"Вот потому что типичное отверстие очень маленькое. Наша формула дает "
+"Вот потому что типичное отверстие очень маленькое. Наша формула даёт "
"результат в миллиметрах. Мы умножим его на `1000`, чтобы вывести результат в "
"_микронах_."
@@ -8098,7 +8098,7 @@
"I \"only\" used ten digits in the above example. Imagine the absurdity of "
"going for all 18!"
msgstr ""
-"Я \"всего лишь\" использовал десять цифр в приведенном выше примере. "
+"Я \"всего лишь\" использовал десять цифр в приведённом выше примере. "
"Представьте абсурдность попытки использовать все 18!"
#. type: Plain text
@@ -8125,7 +8125,7 @@
msgstr ""
"Кроме того, мы можем решить, что независимо от размера результата, мы хотим "
"отображать только четыре значащих цифры (или любое другое их количество, "
-"конечно). Увы, FPU не поддерживает округление до определенного количества "
+"конечно). Увы, FPU не поддерживает округление до определённого количества "
"цифр (в конце концов, он воспринимает числа не как десятичные, а как "
"двоичные)."
@@ -8523,10 +8523,10 @@
"only one or two digits anyway."
msgstr ""
"Этот расчет также довольно прост. Все, что нам нужно сделать, это вычислить "
-"логарифм по основанию 2 от множителя f5.6, который мы только что рассчитали "
-"(хотя нам нужно его значение до округления). Затем мы выводим результат, "
+"логарифм по основанию 2 от множителя f5.6, который мы только что рассчитали ("
+"хотя нам нужно его значение до округления). Затем мы выводим результат, "
"округленный до ближайшего целого числа. Нам не нужно беспокоиться о наличии "
-"более четырех значащих цифр в этом случае: скорее всего, результат будет "
+"более четырёх значащих цифр в этом случае: скорее всего, результат будет "
"содержать только одну или две цифры."
#. type: Title ===
@@ -8643,7 +8643,7 @@
"We can take that idea even further! In our program we are using a _constant_ "
"(the one we named `PC`)."
msgstr ""
-"Мы можем развить эту идею еще дальше! В нашей программе мы используем "
+"Мы можем развить эту идею ещё дальше! В нашей программе мы используем "
"_константу_ (ту, которую назвали `PC`)."
#. type: Plain text
@@ -10817,7 +10817,7 @@
"and use Connors' constant). We have programmed it so later options override "
"early ones-our program will calculate everything using Connors' constant:"
msgstr ""
-"Это дает ему два конфликтующих параметра: `-b` и `-c` (Использовать "
+"Это даёт ему два конфликтующих параметра: `-b` и `-c` (Использовать "
"константу Бендера и использовать константу Коннорса). Мы запрограммировали "
"его так, что более поздние параметры переопределяют ранние — наша программа "
"будет вычислять все, используя константу Коннорса:"
@@ -11033,7 +11033,7 @@
"keyboard be producing PC-style scan codes. It may be a Macintosh(R), or any "
"other computer."
msgstr ""
-"Но это еще не все! Даже если вы убедились, что ваш ввод поступает с "
+"Но это ещё не все! Даже если вы убедились, что ваш ввод поступает с "
"терминала, а вывод отправляется на терминал, нет гарантии, что терминал "
"является ПК: его видеопамять может находиться не там, где вы ожидаете, а "
"клавиатура может генерировать не PC-совместимые скан-коды. Это может быть "

File Metadata

Mime Type
text/plain
Expires
Fri, Apr 17, 10:05 PM (5 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31682588
Default Alt Text
D55582.diff (168 KB)

Event Timeline