Короткая строка, указывающая тип микропроцессора, на котором работает операционная система. Для Pentium Pro или более мощных она может быть i686 , для процессоров класса Alpha — alpha , а для 64-разрядных процессоров PowerPC — ррс64 . | |
nodename | Имя хоста машины, которое обычно является первичным именем хоста в Internet. |
domainname | Домен NIS (или YP), которому принадлежит машина. |
Член nodename
(имя узла) часто называется системным именем хоста (то, что отображает команда hostname
), однако его не следует путать с именем Internet-хоста. Несмотря на то что во многих системах эти члены не различаются, путать их не стоит. В системе с множеством Internet-адресов есть множество имен Internet-хостов, но только одно имя узла, поэтому эти имена не являются эквивалентными.
Более распространенная ситуация связана с домашними компьютерами, которые используют Internet-каналы широкополосной связи. Обычно их имя хоста в Internet выглядит вроде host127- 56.raleigh.myisp.com
, а имена Internet-хостов меняются каждый раз при отключении на длительное время от модема[6]. Владельцы этих машин дают своим компьютерам имя узла, которое им больше нравится, например, loren
или eleanor
, что совершенно не относится к адресам Internet. При наличии множества машин, работающих на одном домашнем шлюзе, все они будут разделять один Internet-адрес (и одно имя Internet-хоста), но могут иметь имена вроде Linux.mynetwork.org
и freebsd.mynetwork.org
, которые все еще не являются именами Internet-хоста. В связи со всеми вышеперечисленными причинами, предполагать, что имя системного узла является допустимым именем Internet-хоста для машины не верно.
Имя узла системы устанавливается с помощью системного вызова sethostname()
[7], и имя домена NIS (YP)[8] — посредством системного вызова setdomainname()
.
#include <unistd.h>
int sethostname(const char * name, size_t len);
int setdomainname(const char * name, size_t len);
Оба этих системных вызова принимают указатель на строку (не обязательно завершающуюся NULL
), которая содержит подходящее имя, и целочисленный аргумент, указывающий размер строки.
6.3. Совместимость
Приложения, которые скомпилированы с заголовочными файлами из библиотеки glibc
и привязанные к одной из ее версий, будут работать и с более поздними версиями библиотеки. Эта обратная совместимость обычно означает, что программисту не придется пересобирать свои приложения только из-за того, что выпущена новая версия glibc
.
Существуют практические ограничения для обратной совместимости. Во-первых, смешивание объектов из разных версий glibc
в одном исполняемом файле может иногда работать, но специально для такой совместимости ничего не предпринимается. Следует отметить, что это касается динамически загружаемых, а также статически связанных объектов. Во-вторых, приложение должно использовать только стандартные возможности glibc
. Приложение, которое зависит от побочных эффектов ошибок или основано на неопределенном поведении одной из версий glibc
, может не работать с более поздними версиями этой библиотеки. Приложение, компонуемое с приватными символами glibc
(обычно они имеют префикс а_
), также вряд ли будет работать с более новыми версиями glibc
.
Обратная совместимость поддерживается тогда, когда задействованы символы, разработанные специально для соответствия стандартам версий. Когда разработчики glibc
хотят внести несовместимое изменение в glibc
, они сохраняют оригинальную реализацию или пишут совместимую реализацию данного интерфейса и помечают его более старым номером версии glibc
. Затем они реализуют новый интерфейс (который может отличаться по семантике, сигнатуре или и тем, и другим) и помечают его новым номером версии glibc
. Приложения, построенные на базе старой версии glibc
, используют старый интерфейс, а приложения, построенные на основе новой версии — новый интерфейс.
Большинство других библиотек поддерживают совместимость, включая номер версии в имя библиотеки и позволяя множеству разных версий быть установленными одновременно. Например, инструментальные наборы GTK+ 1.2 и GTK+ 2.0 могут быть одновременно установлены в одной системе, каждый со своим собственным набором заголовочных и библиотечных файлов, путем встраивания в путь к заголовочным файлам и файлам библиотек имени версии.
Раздел стандарта по наименованию разделяемых библиотек в Linux включает старший номер версии для возможности установки в системе множества версий библиотеки. Это используется не очень часто, поскольку в одной системе невозможно скомпоновать новые приложения с множеством версий библиотеки; это просто обеспечивает поддержку лишь обратной совместимости для существующих приложений, построенных на более старых системах. На практике разработчикам требуется собирать приложения со многими версиями одной и той же библиотеки, поэтому большинство основных библиотек содержат в своем названии и номер версии.
Глава 7
Средства отладки использования памяти
Несмотря на то что С бесспорно является стандартным языком программирования в системах Linux, он имеет ряд особенностей, не дающих программистам возможности писать код, не содержащий тонких ошибок, которые впоследствии очень сложно отладить. Утечки памяти (когда память, выделенная с помощью malloc()
, никогда не освобождается посредством free()
) и переполнение буфера (например, запись за пределы массива) — наиболее распространенные и трудные для обнаружения программные ошибки. Недогрузка буфера (вроде записи перед началом массива) — менее распространенное, но обычно еще более тяжелое для отслеживания явление. В этой главе представлены несколько средств отладки, которые могут значительно упростить обнаружение и изоляцию упомянутых проблем.