Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Эта книга заслуженно пользуется популярностью у серьезных программистов во всем мире, поскольку содержит самую важную и практическую информацию об управлении ядрами UNIX и Linux. Без этих знаний невозможно написать эффективный и надежный код. От основ — файлы, каталоги и процессы — вы постепенно перейдете к более сложным вопросам, таким как обработка сигналов и терминальный ввод/вывод, многопоточная модель выполнения и межпроцессное взаимодействие с применением сокетов. В общей сложности в этой книге охвачены более 70 интерфейсов, включая функции POSIX асинхронного ввода/вывода, циклические блокировки, барьеры и семафоры POSIX.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 1468
Veröffentlichungsjahr: 2023
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Переводчик А. Макарова
Технические редакторы А. Киселев, Н. Суслова
Художники С. Заматевская , Р. Яцко
Корректоры С. Беляева, С. Беляева, Н. Викторова, Н. Викторова
Верстка Н. Лукьянова
Уильям Стивенс, Стивен Раго
UNIX. Профессиональное программирование. 3-е изд. . — СПб.: Питер, 2021.
ISBN 978-5-4461-0649-3
© ООО Издательство "Питер", 2021
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Обновление, выполненное Стивеном Раго (Stephen Rago), — это событие, которого давно и с нетерпением ждало все сообщество профессионалов, использующих в своей работе многоликое семейство UNIX и UNIX-подобных операционных систем. В этом издании исключены устаревшие и добавлены новейшие сведения. Содержание всех тем, примеров и прикладных программ обновлено в соответствии с последними версиями наиболее популярных реализаций UNIX и UNIX-подобных систем. И кроме того, сохранен стиль изложения классического оригинала.
Мукеш Кэкер (Mukesh Kacker), соучредитель и бывший технический директор Pronto Networks, Inc.
Один из фундаментальных классических трудов, посвященных программированию для UNIX.
Эрик С. Рэймонд (Eric S. Raymond), автор книги The Art of UNIX Programming
Это подробнейшее справочное руководство для любого профессионального программиста, работающего с UNIX. Стивену Раго удалось обновить и дополнить текст классической работы Стивенса, сохранив точность оригинала. Особенности прикладных программных интерфейсов разъясняются на простых и понятных примерах. В книге также описывается множество ловушек, о которых следует помнить при написании программ для различных реализаций UNIX, и показывается, как их можно избежать, опираясь на соответствующие стандарты, такие как POSIX 1003.1 (редакция от 2004 года) и Single UNIX Specification, Version 3.
Эндрю Джози (Andrew Josey), директор по сертификации The Open Group и председатель рабочей группы POSIX 1003.1
Второе издание книги — жизненно необходимый справочник для любого, кто занимается разработкой программ для UNIX. Эту книгу я открываю первой, когда хочу изучить или вспомнить какие-либо из интерфейсов системы. Стивен Раго удачно переработал содержание книги и включил в нее сведения о новейших операционных системах, таких как GNU/Linux и Apple OS X, придерживаясь при этом стиля первого издания — как в смысле удобочитаемости, так и в смысле полноты изложения. Для нее всегда найдется место рядом с моим компьютером.
Доктор Бенджамин Куперман (Dr. Benjamin Kuperman), колледж г. Свортмор (Swarthmore)
Книга Advanced Programming in the UNIX® Environment обязательно должна быть у любого серьезного программиста, который пишет для UNIX на языке C. По своей основательности, глубине и ясности подачи материала она не имеет равных.
UniForum Monthly
Многочисленные читатели рекомендовали мне книгу Advanced Programmingin the UNIX® Environment Ричарда Стивенса (издательство Addison-Wesley), и я благодарен им за это. Раньше я даже не слышал об этой книге, хотя она вышла еще в 1992 году. Получив экземпляр книги, я с первых же глав был очарован ею.
Open Systems Today
В книге Advanced Programming in the UNIX® Environment (Addison-Wesley), написанной Ричардом Стивенсом, вы найдете очень понятное и подробное описание внутреннего устройства UNIX. Она включает множество практических примеров, и я нахожу ее очень полезной при разработке системного программного обеспечения.
RS/Magazine
Моим родителям, Ленарду и Грейс
В каждом интервью или в дискуссии после лекции мне задают один и тот же вопрос: «Ожидали ли вы, что UNIX продержится так долго?». Разумеется, в ответ я говорю одно и то же: «Нет, для нас это оказалось полной неожиданностью». Кто-то даже высчитал, что система в том или ином виде существует уже более половины всей жизни компьютерной индустрии.
Процесс развития индустрии был бурным и сложным. По сравнению с началом 70-х годов компьютерные технологии сильно изменились, особенно в области поддержки сетей, вездесущей графики и широкого распространения персональных компьютеров, но система сумела учесть и вобрать в себя все эти явления. Несмотря на то что сегодня в области настольных систем доминируют Microsoft и Intel, рынок определенно движется в направлении от единого поставщика к нескольким, а в последние годы все более ориентируется на открытые стандарты и свободно распространяемые продукты.
К счастью, система UNIX, если рассматривать ее как явление, а не только как торговую марку, не просто двигалась вперед, но сумела возглавить эти тенденции. В 70-х и 80-х годах XX века держателем авторских прав на исходные тексты UNIX была корпорация AT&T, но она всячески поощряла усилия по стандартизации системных интерфейсов и языков. Например, AT&T опубликовала описание интерфейса System V (System V Interface Definition, SVID), которое легло в основу стандарта POSIX. Так получилось, что UNIX легко смогла приспособиться к работе в сетевом окружении и, может быть, не так легко, но довольно эффективно — к работе с графикой. Кроме того, основные интерфейсы ядра UNIX и инструментальные средства уровня пользователя послужили технологической основой для появления движения за программное обеспечение с открытым исходным кодом.
Важно отметить, что статьи и книги, посвященные системе UNIX, всегда были востребованы, даже когда реализация самой системы была закрыта. Примером может служить книга Мориса Баха (Maurice Bach) «The Design of the Unix Operating System». Честно говоря, я мог бы утверждать, что такая долговечность системы во многом обусловлена ее привлекательностью для талантливых авторов, которые стремились объяснить ее красоты и тайны. Брайан Керниган (Brian Kernighan) — один из них, а другой, конечно же, Рич Стивенс (Rich Stevens). Первое издание этой книги, а также серия его книг, посвященных сетевым технологиям, справедливо считаются одними из лучших и потому пользуются заслуженной популярностью.
Первое издание этой книги вышло в свет еще до того, как получили широкое распространение Linux и другие реализации UNIX с открытым исходным кодом, берущие начало из Беркли, а также когда большинство людей имели лишь модемное подключение к сети. Стив Раго (Steve Rago) переработал эту книгу, чтобы учесть изменения, происшедшие в компьютерных технологиях и в стандартах ISO и IEEE с момента выхода первой публикации. Поэтому все примеры в книге обновлены и вновь протестированы.
Это самое достойное второе издание классики.
Мюррей Хилл, Нью-Джерси
Деннис Ритчи
Март 2005
Прошло почти восемь лет, как я приступил к обновлению первого издания, и за эти годы многое изменилось.
• К моменту публикации второго издания организация The Open Group выпустила новую редакцию спецификации Single UNIX Specification от 2004 года, включив в нее два блока изменений. В 2008-м The Open Group выпустила очередную версию спецификации Single UNIX Specification, дополнив основные определения, добавив новые и удалив устаревшие интерфейсы. В нее была включена версия 7 спецификации Base Specification, и в 2009-м она была опубликована как версия POSIX.1 2008 года. В 2010-м была опубликована версия 4 спецификации Single UNIX Specification, куда вошло обновленное определение интерфейса библиотеки curses.
• Организация The Open Group сертифицировала как UNIX-системы версии 10.5, 10.6 и 10.8 операционной системы Mac OS X, выполняющиеся на аппаратной архитектуре Intel.
• Компания Apple Computer прекратила разработку Mac OS X для платформы PowerPC. Начиная с версии 10.6 (Snow Leopard), новые версии операционной системы выпускались только для платформы x86.
• Были открыты исходные коды операционной системы Solaris, чтобы повысить ее конкурентоспособность с популярной открытой моделью разработки, которой следуют FreeBSD, Linux и Mac OS X. Когда в 2010-м Oracle Corporation купила Sun Microsystems, она прекратила разработку OpenSolaris. Вследствие этого сообществом Solaris был образован открытый проект Illumos на основе OpenSolaris, в рамках которого было продолжено развитие системы. За дополнительной информацией обращайтесь по адресу http://www.illumos.org.
• В 2011-м был обновлен стандарт языка C, но так как еще не все системы переориентировались на него, мы продолжим ссылаться на стандарт 1999 года.
Особо следует отметить, что платформы, использовавшиеся в качестве примеров во втором издании, значительно устарели. В этом, третьем, издании я буду опираться на следующие платформы:
1. FreeBSD 8.0, наследница 4.4BSD, от Computer Systems Research Group из Калифорнийского университета в Беркли, работающая на 32-разрядном процессоре Intel Pentium.
2. Linux 3.2.0 (дистрибутив Ubuntu 12.04), свободно распространяемая UNIX-подобная операционная система, работающая на 64-разрядном процессоре Intel Core i5.
3. Apple Mac OS X, версия 10.6.8 (Darwin 10.8.0), работающая на 64-разрядном процессоре Intel Core 2 Duo. (Ядро Darwin основано на ядрах FreeBSD и Mach.) Я выбрал версию для платформы Intel, потому что последние версии Mac OS X больше не поддерживают платформу PowerPC. Недостаток этого выбора в том, что появился перекос в сторону Intel. А при обсуждении проблем разнородности весьма полезно иметь процессоры с различными характеристиками, такими как порядок следования байтов и размер целого числа.
4. Solaris 10 (производная от System V Release 4), выпущенная компанией Sun Microsystems (ныне Oracle) и работающая на 64-разрядном процессоре UltraSPARC IIi.
Одним из значительных изменений в версии POSIX.1-2008 спецификации Single UNIX Specification является объявление устаревшими интерфейсов, имеющих отношение к STREAMS. Это первый шаг на пути удаления интерфейсов из будущих версий стандарта. По этой причине я скрепя сердце удалил из этого издания книги все, что относилось к STREAMS. Я не считаю это изменение удачным, потому что интерфейсы STREAMS выглядят более привлекательными на фоне сокетов и во многих отношениях являются более гибкими. Должен признать, что я не могу быть полностью беспристрастным, когда дело доходит до механизма STREAMS, но у меня нет причин оспаривать понижение его значимости в современных системах:
• Linux не включает поддержку STREAMS в базовую систему, хотя существуют пакеты (LiS и OpenSS7), добавляющие эту функциональность;
• Solaris 10 включает поддержку STREAMS, но уже Solaris 11 использует реализацию сокетов, не опирающуюся на интерфейсы STREAMS;
• Mac OS X не включает поддержку STREAMS;
• FreeBSD не включает поддержку STREAMS (и никогда не включала).
После удаления разделов, связанных с механизмом STREAMS, появилась возможность добавить обсуждение новых тем, таких как POSIX-совместимый асинхронный ввод/вывод.
Второе издание книги охватывало ядро Linux версии 2.4. В этом издании я использую версию 3.2. Самое большое отличие между ними заключается в подсистеме управления потоками выполнения. В версии Linux 2.6 поддержка потоков выполнения была реализована на основе библиотеки Native POSIX Thread Library (NPTL), которая делает потоки выполнения в Linux более похожими на потоки в других системах.
Если говорить в общем, в это издание было включено более 70 новых интерфейсов, в том числе интерфейсов асинхронного ввода/вывода, циклические блокировки (spin locks), барьеры (barriers) и семафоры POSIX. Описание наиболее устаревших интерфейсов было удалено, кроме некоторых, распространенных повсеместно.
Я получил от читателей множество комментариев и замечаний после выхода второго издания и хочу поблагодарить их за то, что помогли повысить точность представленной информации. Далее перечислены те, кто оказались первыми: Сет Арнольд (Seth Arnold), Люк Баккен (Luke Bakken), Рик Баллард (Rick Ballard), Йоханнес Биттнер (Johannes Bittner), Дэвид Брондер (David Bronder), Влад Буслов (Vlad Buslov), Питер Батлер (Peter Butler), Ю-Чинг Чен (Yuching Chen), Майк Ченг (Mike Cheng), Джим Коллинз (Jim Collins), Боб Кузинс (Bob Cousins), Уилл Деннис (Will Dennis), Томас Дики (Thomas Dickey), Лойк Домайне (Loic Domaigne), Игорь Фуксман (Igor Fuksman), Алекс Гезерлис (Alex Gezerlis), М. Скотт Гордон (M. Scott Gordon), Тимоти Гойя (Timothy Goya), Тони Грэхем (Tony Graham), Майкл Хобгуд (Michael Hobgood), Майкл Керриск (Michael Kerrisk), Юнг-Ху Квон (Youngho Kwon), Ричард Ли (Richard Li), Сюйек Лиу (Xueke Liu), Юн Лонг (Yun Long), Дэн Мак-Грегор (Dan McGregor), Дилан Мак-Нами (Dylan McNamee), Грег Миллер (Greg Miller), Симон Морган (Simon Morgan), Гарри Ньютон (Harry Newton), Джим Олдфилд (Jim Oldfield), Скотт Пэриш (Scott Parish), Звездан Петкович (Zvezdan Petkovic), Дэвид Рейсс (David Reiss), Константинос Сакутис (Konstantinos Sakoutis), Дэвид Смут (David Smoot), Дэвид Сомерс (David Somers), Андрей Ткачук (Andriy Tkachuk), Натан Уикс (Nathan Weeks), Флориан Веймер (Florian Weimer), Ку-Инг-Янг Сюй (Qingyang Xu) и Майкл Залокар (Michael Zalokar).
Технические рецензенты помогли повысить точность представленной в книге информации. Большое спасибо Стиву Альберту (Steve Albert), Богдану Барбу (Bogdan Barbu) и Роберту Дэю (Robert Day). Особую благодарность хочу выразить Джеффу Клэру (Geoff Clare) и Эндрю Джози (Andrew Josey) за дополнительные сведения, касающиеся спецификации Single UNIX Specification, и помощь в уточнении информации в главе 2. Кроме того, хочу поблагодарить Кена Томпсона (Ken Thompson) за ответы на вопросы, связанные с историей развития UNIX.
Еще раз хочу поблагодарить сотрудников издательства Addison-Wesley, с которыми было приятно работать. Спасибо Киму Бодингхеймеру (Kim Boedigheimer), Ромми Френчу (Romny French), Джону Фуллеру (John Fuller), Джессике Голдстейн (Jessica Goldstein), Джулии Нэйхил (Julie Nahil) и Дебре Уильямс-Коули (Debra Williams-Cauley). Также выражаю свою благодарность Джиллу Хоббсу (Jill Hobbs) за отличную работу по техническому редактированию.
Наконец, я благодарен моей семье, которая с пониманием отнеслась к тому, что я потратил массу времени на работу над этим изданием.
Как и прежде, исходный код примеров из этой книги доступен на сайте www.apuebook.com. Я буду благодарен всем читателям, кто пришлет по электронной почте свои комментарии, предложения и замечания об ошибках.
Уоррен, Нью-Джерси
Стивен Раго
Январь 2013
Мой первый контакт с Ричем Стивенсом состоялся по электронной почте, когда я сообщил ему об опечатке в его книге «UNIX Network Programming»1. Позже он говорил, что я оказался первым, кто прислал ему сообщение о найденной ошибке. До самой его смерти в 1999 году мы время от времени обменивались электронными письмами. Обычно это происходило, когда один из нас задавался каким-то вопросом и полагал, что другой мог бы на него ответить. Мы встречались с ним за обедом на конференциях USENIX и на лекциях, которые он читал.
Рич Стивенс был другом и настоящим джентльменом. Когда в 1993 году я написал книгу «UNIX System V Network Programming», я представлял ее как версию книги Рича «UNIX Network Programming», ориентированную на System V. Рич охотно взялся за рецензирование моих глав, воспринимая меня не как конкурента, но как коллегу. Мы часто обсуждали сотрудничество в работе над версией его книги «TCP/IP Illustrated»2, посвященной STREAMS. Если бы события сложились по-иному, вероятно, мы сделали бы это, но Ричарда больше нет с нами, поэтому приближением к осуществлению совместной работы я могу считать обновление данной книги.
Когда издательство Addison-Wesley сообщило, что заинтересовано в обновлении книги Рича, я думал, что дополнений будет не очень много. Даже по прошествии 13 лет его работа остается актуальной. Но современный мир UNIX значительно отличается от того, каким он был во время выхода первого издания книги.
• Версии System V практически вытеснила операционная система Linux. Основные производители аппаратного обеспечения, поставляющие свою продукцию в комплекте с собственными версиями UNIX, либо выпустили версии своих продуктов для Linux, либо объявили о ее поддержке. ОС Solaris, вероятно, осталась последней наследницей System V Release 4, обладающей более или менее заметной долей рынка.
• После выхода 4.4BSD группа по проведению исследований в области информационных технологий (Computing Science Research Group, CSRG) из Калифорнийского университета в Беркли приняла решение о завершении разработки операционной системы UNIX, однако существует несколько групп добровольцев, которые продолжают поддерживать открытые версии.
• Появление ОС Linux, поддерживаемой тысячами добровольцев, позволило любому обладать компьютером, работающим под управлением UNIX-подобной операционной системы, распространяемой с открытым исходным кодом для новейших устройств. Успех Linux выглядит не совсем обычно, учитывая, что существует несколько свободно распространяемых BSD-альтернатив.
• В очередной раз проявив себя в качестве инновационной компании, Apple Computer отказалась от устаревшей операционной системы Mac и заменила ее системой, созданной на основе Mach и FreeBSD.
В связи с этим я попытался дополнить сведения, содержащиеся в книге, чтобы охватить эти четыре платформы.
Когда в 1992 году Рич написал свою книгу «Advanced Programming in the UNIX Environment», я избавился от большей части имевшихся у меня руководств по программированию в UNIX и оставил на своем столе две книги: словарь и «Advanced Programming in the UNIX Environment». Надеюсь, что вы найдете это издание книги не менее полезным.
Работа Рича не потеряла актуальности. Я старался сохранить оригинальное изложение материала, но слишком многое произошло за последние 13 лет. Особенно это относится к стандартам, которые затрагивают программные интерфейсы UNIX.
Везде, где это было необходимо, я дополнил описания интерфейсов, которые изменились в результате стандартизации. Особенно это заметно в главе 2, посвященной стандартам. В этом издании мы будем основываться на стандарте POSIX.1 2001 года как более универсальном по сравнению с версией 1990 года, на которой была основана первая редакция книги. Стандарт ISO C 1990 года был изменен и дополнен в 1999 году, и некоторые изменения коснулись интерфейсов, описываемых стандартом POSIX.1.
Сегодня спецификация POSIX.1 охватывает намного большее количество интерфейсов. Основные спецификации Single UNIX Specification (опубликованные The Open Group, ранее X/Open) вошли в состав POSIX.1. Теперь POSIX.1 включает в себя ряд стандартов 1003.1 и некоторые из предварительных стандартов, опубликованных ранее.
В соответствии с этим я дополнил книгу новыми главами, охватывающими новые темы. Понятия потоков и многопоточных приложений очень важны, поскольку они дают программистам более элегантный способ организации параллельных вычислений и асинхронной обработки.
Интерфейс сокетов теперь стал частью стандарта POSIX.1. Он обеспечивает единый интерфейс межпроцессных взаимодействий (Interprocess Communication, IPC), не зависящий от местонахождения процессов, и его обсуждение является естественным продолжением глав, посвященных IPC.
Я опустил рассмотрение большинства интерфейсов реального времени, которые появились в POSIX.1. Их лучше всего изучать по книгам, специально посвященным созданию приложений реального времени. Одну из таких книг вы найдете в списке литературы.
Я изменил некоторые примеры в последних главах, чтобы приблизить их к практическим задачам. Например, в наши дни немногие системы работают с PostScript-принтерами через последовательный или параллельный порт. Чаще встречается случай, когда доступ к таким принтерам осуществляется посредством сети, поэтому я изменил учебный пример взаимодействия с принтером, чтобы учесть это обстоятельство.
Глава, посвященная взаимодействию с модемом, потеряла актуальность. Однако чтобы оригинальный материал не был утерян окончательно, он выложен на веб-сайте книги в двух форматах: PostScript (http://www.apuebook.com/lostchapter/modem.ps) и PDF (http://www.apuebook.com/lostchapter/modem.pdf).
Все исходные тексты примеров из книги также доступны на сайте www.apuebook.com. Большая часть примеров была протестирована на четырех платформах.
1. FreeBSD 5.2.1 — системе, производной от 4.4BSD, от Computer Systems Research Group из Калифорнийского университета в Беркли, работающей на процессоре Intel Pentium.
2. Linux 2.4.22 (дистрибутив Mandrake 9.2) — свободно распространяемой UNIX-подобной операционной системе, работающей на процессоре Intel Pentium.
3. Solaris 9 — производной от System V Release 4, от Sun Microsystems, работающей на 64-разрядном процессоре UltraSPARCIIi.
4. Darwin 7.4.0 — системе, основанной на FreeBSD и Mach, которая поддерживается Apple Mac, работающей на процессоре PowerPC.
Первое издание этой книги, которое сразу же стало классикой, было полностью написано Ричем Стивенсом.
Вероятно, мне не удалось бы справиться с обновлением книги без поддержки моей семьи. Они стоически терпели груды разбросанных повсюду бумаг (их было гораздо больше, чем обычно), монополизацию мною большинства компьютеров в доме и огромное количество времени, когда мое лицо было скрыто за терминалом. Моя супруга Джин (Jeanne) даже помогла мне, установив Linux на одну из тестовых машин.
Технические рецензенты предложили немало улучшений и исправлений и помогли удостовериться в правильности содержимого книги. Большое спасибо Дэвиду Бозуму (David Bausum), Дэвиду Борхему (David Boreham), Кейту Бостику (Keith Bostic), Марку Эллису (Mark Ellis), Филу Говарду (Phil Howard), Эндрю Джози (Andrew Josey), Мукешу Кэкеру (Mukesh Kacker), Брайану Кернигану (Brian Kernighan), Бенгту Клебергу (Bengt Kleberg), Бену Куперману (Ben Kuperman), Эрику Рэймонду (Eric Raimond) и Энди Рудофу (Andy Rudoff).
Я также хотел бы поблагодарить Энди Рудофа за ответы на вопросы, касающиеся ОС Solaris, и Денниса Ритчи за то, что он «перекапывал» старые работы в поисках фактов по истории UNIX. Еще раз хочу поблагодарить сотрудников издательства Addison-Wesley, с которыми было приятно работать. Спасибо Тиррелу Альбо (Tyrrell Albaugh), Мэри Франц (Mary Franz), Джону Фуллеру (John Fuller), Карен Геттман (Karen Gettman), Джессике Голдстейн (Jessica Goldstein), Норин Реджине (Noreen Regina) и Джону Уэйту (John Wait). Мои благодарности Эвелин Пайл (Evelyn Pyle) за отличную работу по техническому редактированию.
Как и Рич, я также буду благодарен всем читателям, кто пришлет свои комментарии, предложения и замечания об ошибках.
Уоррен, Нью-Джерси
Стивен Раго
Апрель 2005
1Стивенс У., Феннер Б., Рудофф Э. UNIX: разработка сетевых приложений / Пер. с англ. — СПб.: Питер, 2006.
2Ричард У. Стивенс. Протоколы TCP/IP. В подлиннике / Пер. с англ. — СПб.: БХВ-Санкт-Петербург, 2003.
В этой книге описаны программные интерфейсы системы UNIX: интерфейс системных вызовов и многочисленные функции из стандартной библиотеки языка C. Она предназначена для всех, кто пишет программы, работающие под управлением UNIX.
Подобно большинству операционных систем, UNIX предоставляет работающим в ней программам разнообразные услуги: открытие и чтение файлов, запуск новых программ, выделение памяти, получение текущего времени и т.д. Все это называется интерфейсом системных вызовов (system call interface). Кроме того, стандартная библиотека языка C включает огромное количество функций, которые используются практически в любой программе, написанной на C (форматированный вывод значений переменных, сравнение строк и т.п.).
Интерфейс системных вызовов и библиотечные функции традиционно описываются во втором и третьем разделах «Unix Programmer’s Manual» (Руководство программиста UNIX). Эта книга не дублирует указанные разделы. В ней вы найдете примеры и пояснения, которые отсутствуют в упомянутом руководстве.
Быстрый рост количества версий UNIX, наблюдавшийся в 80-е годы, был урегулирован различными международными стандартами, которые стали появляться с конца 80-х. К ним относится стандарт ANSI языка программирования C, семейство стандартов IEEE POSIX (которые продолжают развиваться по сей день) и руководство по обеспечению переносимости X/Open.
Данная книга описывает эти стандарты. И не просто описывает, а рассматривает их применительно к популярным реализациям — System V Release 4 и 4.4BSD. Здесь представлены соответствующие действительности описания, которых зачастую недостает самим стандартам и книгам, лишь описывающим стандарты.
Эта книга делится на шесть частей.
1. Обзор и знакомство с базовыми понятиями, связанными с программированием в UNIX, и с терминологией (глава 1). Обсуждение достижений в области стандартизации UNIX и различных реализаций UNIX (глава 2).
2. Ввод/вывод: небуферизованный ввод/вывод (глава 3), характеристики файлов и каталогов (глава 4), стандартная библиотека ввода/вывода (глава 5) и стандартные системные файлы (глава 6).
3. Процессы: окружение процессов в UNIX (глава 7), управление процессами (глава 8), взаимоотношения между различными процессами (глава 9) и сигналы (глава 10).
4. Дополнительно об операциях ввода/вывода: терминальный ввод/вывод (глава 11), расширенные операции ввода/вывода (глава 12) и процессы-демоны (глава 13).
5. IPC — взаимодействия между процессами (главы 14 и 15).
6. Примеры: библиотека базы данных (глава 16), управление PostScript-принтером (глава 17), программа работы с модемом (глава 18) и использование псевдотерминалов (глава 19).
При чтении книги нелишним будет знание языка C, равно как и некоторый опыт использования UNIX. Наличие опыта разработки программ для UNIX не требуется. Книга предназначена для программистов, знакомых с UNIX или с другими операционными системами и желающих детально изучить возможности, предоставляемые большинством реализаций UNIX.
Данная книга содержит множество примеров — примерно 10 000 строк исходного кода. Все примеры написаны на языке C. Кроме того, примеры написаны в соответствии со стандартом ANSI C. Желательно, чтобы при чтении этой книги у вас под рукой был текст «Unix Programmer’s Manual» (Руководство программиста UNIX) для вашей операционной системы, так как мы часто будем ссылаться на него при обсуждении малопонятных или зависящих от реализации особенностей.
Обсуждение практически каждой функции или системного вызова будет сопровождаться небольшой законченной программой. Это намного проще, чем рассматривать те же функции в больших программах, и позволит исследовать аргументы и возвращаемые значения. Так как некоторые из маленьких программ представляют собой достаточно искусственные примеры, в книгу включено несколько больших примеров (главы 16, 17, 18 и 19). Они демонстрируют решение практических задач.
Все примеры программ были включены в текст книги прямо из файлов с исходными текстами. Копии всех примеров в виде файлов вы найдете на анонимном FTP-сервере ftp.uu.net, в архиве published/books/stevens.advprog.tar.Z. Вы можете загрузить эти примеры и поэкспериментировать с ними в своей операционной системе.
К сожалению, все операционные системы находятся в постоянном движении. UNIX не является исключением. Следующая диаграмма показывает процесс эволюции различных версий System V и 4.xBSD.
Рис. 1. Хронология эволюции различных версий System V
Под обозначением 4.xBSD подразумеваются различные операционные системы от Computer Systems Research Group из Калифорнийского университета в Беркли. Эта группа также занимается распространением BSD Net 1 и BSD Net 2 — операционных систем семейства 4.xBSD с открытым исходным кодом. Под обозначением SVRx подразумевается System V Release x от AT&T. XPG3 — это «X/Open Portability Guide, Issue 3» (Руководство X/Open по обеспечению переносимости, выпуск 3). ANSI C — это стандарт ANSI языка программирования C. POSIX.1 — это стандарт ISO и IEEE интерфейса UNIX-подобных операционных систем. Более подробно об этих стандартах и различных версиях UNIX мы поговорим в разделах 2.2 и 2.3.
В этой книге под обозначением 4.3+BSD будут подразумеваться версии UNIX, появившиеся между выпусками BSD Net 2 и 4.4BSD.
К моменту написания книги версия 4.4BSD еще не была выпущена, поэтому было бы преждевременно говорить об операционной системе 4.4BSD. Однако эту серию операционных систем нужно было как-то обозначить, поэтому повсюду в книге мы будем использовать обозначение 4.3+BSD.
Большинство примеров в книге протестированы в четырех версиях UNIX.
1. UNIX System V/386 Release 4.0 Version 2.0 («чистая SVR4») от U.H. Corp. (UHC), работающая на процессоре Intel 80386.
2. 4.3+BSD от Computer Systems Research Group, отделение информатики, Калифорнийский университет в Беркли, работающая на компьютере Hewlett Packard.
3. BSD/386 (производная от BSD Net 2) от Berkeley Software Design Inc., работающая на процессоре Intel 80386. Эта система практически полностью соответствует тому, что мы называем 4.3+BSD.
4. SunOS, версии 4.1.1 и 4.1.2 от Sun Microsystems (системы, в которых хорошо заметно наследие Беркли, но при этом много дополнений, пришедших из System V), работающие на SPARC-станциях SLC.
В книге представлены многочисленные тесты производительности с указанием проверяемых операционных систем.
Я многим обязан моей семье за любовь, поддержку и множество выходных дней, потерянных за последние полтора года. Создание книги — во многом заслуга семьи. Спасибо вам, Салли, Билл, Эллен и Дэвид.
Я особенно благодарен Брайану Кернигану за его помощь при работе над книгой. Его многочисленные рецензии рукописи и ненавязчивые рекомендации по улучшению стиля изложения, надеюсь, будут заметны в окончательном варианте. Стив Раго также отдал немало времени рецензированию рукописи и ответам на многие вопросы об устройстве и истории развития System V. Выражаю свою благодарность другим техническим рецензентам издательства Addison-Wesley, которые дали ценные комментарии по различным частям рукописи: Мори Баху (Maury Bach), Марку Эллису (Mark Ellis), Джефу Гитлину (Jeff Gitlin), Питеру Ханиману (Piter Honeyman), Джону Линдерману (John Linderman), Дугу Мак-Илрою (Doug McIlroy), Эви Немет (Evi Nemeth), Крэйгу Партриджу (Craig Partridge), Дейву Пресотто (Dave Presotto), Гэри Уилсону (Gary Wilson) и Гэри Райту (Gary Wright).
Кейт Бостик (Keith Bostic) и Кирк Мак-Кьюcик (Kirk McKusick) из U.C. Berkeley CSRG предоставили учетную запись, которая использовалась для проверки примеров в последней версии BSD (также большое спасибо Питеру Салусу (Peter Salus)). Сэм Нэйтарос (Sam Nataros) и Йоахим Саксен (Joachim Sacksen) из UHC предоставили копию операционной системы SVR4 для тестирования примеров. Трент Хейн (Trent Hein) помог получить альфа- и бета-версии BSD/386.
Другие мои друзья на протяжении последних лет часто оказывали мне немаловажную помощь: Пол Лукина (Paul Lucchina), Джо Годсил (Joe Godsil), Джим Хог (Jim Hogue), Эд Танкус (Ed Tankus) и Гэри Райт (Gary Wright). Редактор из издательства Addison-Wesley, Джон Уэйт (John Wait), был моим большим другом на протяжении всего этого времени. Он никогда не жаловался на срыв сроков и постоянное увеличение числа страниц. Отдельное спасибо Национальной оптической астрономической обсерватории (NOAO) и особенно Сиднею Уольфу (Sidney Wolff), Ричарду Уольфу (Richard Wolff) и Стиву Гранди (Steve Grandi) за предоставленное машинное время.
Настоящие книги о UNIX пишутся в формате troff, и данная книга также следует этой проверенной временем традиции. Копия книги, готовая к тиражированию, была подготовлена автором с помощью пакета groff, созданного Джеймсом Кларком (James Clark). Большое ему спасибо за такой замечательный пакет и за его быстрый отклик на замеченные ошибки. Быть может, мне когда-нибудь удастся разобраться с концевыми сносками в troff.
Я буду благодарен всем читателям, которые пришлют свои комментарии, предложения и замечания об ошибках.
Таксон, Аризона
Ричард Стивенс
Апрель 1992
http://ww.kohala.com/~rstevens
