Wydawnictwa Naukowo- Techniczne \ W. Richard Stevens Programowanie w środowisku @ systemu UNIX Wydawnictwa CLASILA Naukowo- Techniczne Warszawa W. Richard Stevens W skład serii „Klasyka Informatyki" Programowanie wchodzą dzieła najwybitniejszych uczonych świata w dziedzinie informatyki - książki o nieprzemijającej w środowisku wartości, stanowiące bazę solidnego, klasycznego wykształcenia każdego profesjonalnego informatyka. @ systemu UNIX Wydawnictwa Naukowo-Techniczne przygotowały tę serię ze szczególną pieczołowitością, powierzając tłumaczenie poszczególnych tomów znakomitym specjalistom. Wyboru książek dokonano w ścisłej współpracy z polskim środowiskiem akademickim, Z angielskiego przełożyła i dedykując serię głównie studentom Maja Górecka-Wolniewicz ; informatyki i młodym pracownikom naukowym. Przez następnych osiem lat (1982-1990) był 0 Autorze: wiceprezesem Health Systems International i tworzył oprogramowanie do systemu ochrony W. Richard Stevens był uznanym w świecie zdrowia, wprowadzonego w stanie Connecticut. autorytetem w dziedzinie oprogramowania sieciowego i autorem bestsellerów informatycznych. Od 1990 roku mieszkał w Tucson. Nie miał stałego Niemal każda napisana przez niego książka zatrudnienia. Cały czas poświęcał na pisanie natychmiast zdobywała uznanie czytelników. książek i prowadzenie wykładów na ich podstawie. A to z kilku powodów. Po pierwsze, był znakomitym Zmarł 1 września 1999 roku. fachowcem, doskonale znającym się na swojej dziedzinie. Po drugie, miał wspaniałe wyczucie potrzeb czytelników; pisał o tym, co było ważne 1 co rzeczywiście musieli wiedzieć. Po trzecie, pisał jasno i zwięźle; przekazywane przez niego informacje były rzetelne i na dobrym poziomie szczegółowości. Jego książki zawierają mnóstwo przykładowych programów, które mogą stanowić bibliotekę gotowych rozwiązań. Urodził się w 1951 roku w Luanshyi, w Zambii (dawnej Rodezji Północnej). W 1968 roku ukończył Fishburne Military School, a w 1973 roku studia w University of Michigan ze stopniem bakałarza techniki lotniczej i astronautycznej. W latach 1973-1975 był programistą (w językach asemblerowych) w firmie Singer's M&M w Santa Ana, w Kalifornii. W latach 1975-1982 pracował na pełnym etacie w Kitt Peak Observatory w Tucson, w Arizonie (jednocześnie robił magisterium i doktorat z inżynierii systemów Systemowi Michigan Terminal System, w University of Arizona). Zajmował się wtedy czyli MTS, pisaniem programów do pozyskiwania danych i komputerowi 360/67 w czasie rzeczywistym i do przetwarzania obrazów. ine o oryginale r. RlCHARD STEVENS dvanced Programming in the UNIX® Environment ipyright © 1993 by Addison Wesley Longman, Inc. th Printing July 1999 Spis treści iblished by arrangement with Addison Wesley Longman, Inc. Rights Reserved owadzenie serii Elżbieta Beuermann Przedmowa 1' ;daktor Zuzanna Grzejszczak \ cładkę i strony tytułowe projektował Paweł G. Rubaszewski :daktor techniczny Anna Szeląg Pojęcia podstawowe 2'. rekta Zespół zygotowanie do druku Marianna Zadrożna 1.1 Wprowadzenie 2. 1.2 Logowanie w systemie 2. 1.3 Pliki i katalogi 2 JIX jest zarejestrowanym znakiem towarowym UNIX System Labs, Inc. 1.4 Wejście i wyjście 2 1.5 Programy i procesy 3 1.6 Właściwości ANSI C 3 Copyright for the Polish edition by 1.7 Obsługa błędów 3 ydawnictwa Naukowo-Techniczne 1.8 Identyfikacja użytkownika 4 arszawa 2002 1.9 Sygnały 4 1 Rights Reserved 1.1.0 Czas w systemie Unix 4. inted in Poland 1.11 Funkcje systemowe i biblioteczne Ą 1.12 Podsumowanie 4] wór w całości ani we fragmentach nie może być powielany ani rozpowszechniany pomocą urządzeń elektronicznych, mechanicznych, kopiujących, nagrywających i nnych, w tym również nie może być umieszczany ani rozpowszechniany w postaci frowej zarówno w Internecie, jak i w sieciach lokalnych bez pisemnej zgody , . 1 Standaryzacja systemu Unix, różne implementacje ^ •siadacza praw autorskich. 2.1 Wprowadzenie ires poczty elektronicznej: [email protected] 2.2 Standaryzacja systemu Unix rona WWW: www.wnt.com.pl 2.2.1 ANSIC 4 2.2.2 IEEE POSIX 3 2.2.3 X/Open XPG3 5 5BN 83-204-2669-3 2.2.4 FIPS 51 Spis treści Spis treści ! 2.3 Implementacje systemu Unix 53 4.4 Bity ustanowienia identyfikatora użytkownika 2.3.1 System V Wydanie 4 54 oraz ustanowienia identyfikatora grupy 11 ( 2.3.2 System 4.3+BSD 54 4.5 Prawa dostępu do pliku li; 2.4 Standardy a ich implementacje 55 4.6 Prawa własności nowych plików i katalogów 11; 2.5 Ograniczenia 56 4.7 Funkcja access 1 ]< 2.5.1 Ograniczenia ANSI C 57 4.8 Funkcja umask lii 2.5.2 Ograniczenia POSIX 58 4.9 Funkcje chmod i f chmod 11! 2.5.3 Ograniczenia XPG3 60 4.10 Bit lepki 12: 275.4 Funkcje sysconf, pathconf i fpathconf 6K 4.11 Funkcje chown, fchown oraz lchown \2'. 2.5.5 Wymagania FIPS 151-1 67 4.12 Rozmiar pliku 12: 2.5.6 Podsumowanie ograniczeń 67 4.13 Skracanie plików 12' 2.5.7 Nieokreślone ograniczenia fazy wykonania 70 4.14 Systemy plików 12' 2.6 Makra sprawdzające parametry 73 4.15 Funkcje link, unlink, remove i rename 13 2.7 Elementarne systemowe typy danych 75 4.16 Dowiązania symboliczne 13: 2.8 Konflikty między standardami 75 4.17 Funkcje symlink i readlink 13) 2.9 Podsumowanie 76 4.18 Czasy związane z plikiem 13) 4.19 Funkcja utime 13< J 4.20 Funkcje mkdir i rmdir 14^ 4.21 Czytanie katalogów 14^ Operacje wejścia-wyjścia dla plików 77 4.22 Funkcje chdir, f chdir oraz getcwd 14* 4.23 Specjalne pliki urządzeń 15: 3.1 Wprowadzenie 77 4.24 Funkcje sync oraz f sync 15* 3.2 Deskryptory plików 77 4.25 Zestawienie bitów praw dostępu do pliku 15: 3.3 Funkcja open 78 4.26 Podsumowanie 15( 3.4 Funkcja creat 81 3.5 Funkcja close 81 5 3.6 Funkcja lseek 82 3.7 Funkcja read 85 Standardowa biblioteka wejścia-wyjścia 15S 3.8 Funkcja write 86 5.1 Wprowadzenie 15? 3.9 Wydajność obsługi wejścia-wyjścia 87 5.2 Obiekty strumieni i typ danych FILE 15? 3.10 Współdzielenie pliku 89 5.3 Standardowe wejście, standardowe wyjście 3.11 Operacje atomowe 92 i standardowy strumień komunikatów awaryjnych 16'. 3.12 Funkcje dup i dup2 94 5.4 Buforowanie 16f 3.13 Funkcja fcntl 96 5.5 Otwarcie strumienia 16^ 3.14 Funkcja ioctl 101 5.6 Czytanie i zapisywanie danych ze strumienia -6', 3.15 Katalog /dev/fd 102 5.7 Wejście-wyjście wiersz po wierszu 51\ 3.16 Podsumowanie 104 5.8 Wydajność standardowego wejścia-wyjścia 17^ 5.9 Binarne wejście-wyjście 17--' _4 5.10 Pozycjonowanie strumienia 17j 5.11 Wejście-wyjście formatowane 17' Pliki i katalogi 106 5.12 Szczegóły implementacyjne 1^ 4.1 Wprowadzenie 106 5.13 Pliki tymczasowe 18 i 4.2 Funkcje stat, f stat oraz lstat 106 5.14 Techniki zastępujące standardowe wejście-wyjście 18* 4.3 Typy plików 107 5.15 Podsumowanie 183 Spis treści Spis treści 11 8.11 Pliki interpretowane 266 8.12 Funkcja system 271 Systemowe pliki danych 187 8.13 Rejestrowanie procesów 276 6.1 Wprowadzenie 187 8.14 Identyfikacja użytkownika 282 6.2 Plik haseł 187 8.15 Czasy procesu 283 6.3 Maskowanie haseł 191 8.16 Podsumowanie 286 6.4 Plik grup 191 6.5 Identyfikatory dodatkowych grup 193 9 6.6 Inne pliki danych 194 Relacje między procesami 288 6.7 Rejestry logowania 196 6.8 Dane identyfikujące system 196 9.1 Wprowadzenie 288 6.9 Procedury obsługi czasu i daty 198 9.2 Logowania terminalowe 288 6.10 Podsumowanie 202 9.3 Logowania sieciowe 293 9.4 Grupy procesów 295 _7 9.5 Sesje 297 9.6 Terminal sterujący 298 Środowisko procesu w systemie Unix 203 9.7 Funkcje tcgetpgrp oraz tcsetpgrp 300 7.1 Wprowadzenie 203 9.8 Sterowanie zadaniami 300 7.2 Funkcja main 203 9.9 Wykonywanie programów z powłoki 305 7.3 Zakończenie procesu 204 9.10 Osierocone grupy procesów 310 7.4 Argumenty wiersza poleceń 208 9.11 Implementacja w systemie 4.3+BSD 313 7.5 Lista zmiennych środowiskowych 208 9.12 Podsumowanie 315 7.6 Program w języku C w pamięci operacyjnej 210 7.7 Biblioteki wspólne 211 10 7.8 Alokacja pamięci 212 7.9 Zmienne środowiskowe 215 Sygnały 317- 7.10 Funkcje setjmp oraz longjmp 219 10.1 Wprowadzenie 317 7.11 Funkcje getrlimit oraz setrlimit 225 10.2 Koncepcje sygnałów 318 7.12 Podsumowanie 229 10.3 Funkcja signal 327 10.4 Sygnały niezawodne 331 JS 10.5 Przerwane funkcje systemowe 333 10.6 Funkcje współużywalne 335 j Sterowanie procesem 231 10.7 Różne semantyki SIGCLD 338 •. 8.1 Wprowadzenie 231 10.8 Terminologia i semantyka sygnałów niezawodnych 341 8.2 Identyfikatory procesu 231 10.9 Funkcje kill oraz raise 342 8.3 Funkcja fork 232 10.10 Funkcje alarm orazpause 344 i 8.4 Funkcja vf ork 238 10.11 Zbiory sygnałów 351 8.5 Funkcja exit 241 10.12 Funkcja sigprocmask 353 , 8.6 Funkcje wait oraz waitpid 243 10.13 Funkcja sigpending 354 ] 8.7 Funkcje wait3 oraz wait4 249 10.14 Funkcja sigaction 35 7 _' 8.8 Sytuacje wyścigu 250 10.15 Funkcje sigset jmp oraz siglongjmp 360, 8.9 Funkcje exec 254 10.16 Funkcja sigsuspend 364 8.10 Zmiana identyfikatorów użytkownika i identyfikatorów grup ... 261 10.17 Funkcja abort 371 , Spis treści Spis treści 13 10.18 Funkcja system 372 13 10.19 Funkcja sleep 379 Procesy-demony 492 10.20 Sygnały sterowania zadaniami 382 10.21 Inne właściwości 384 13.1 Wprowadzenie 492 10.22 Podsumowanie 386 13.2 Charakterystyki demona 492 13.3 Zasady programowania demonów 494 13.4 Rejestrowanie błędów 496 \l 13.4.1 Procedura obsługi strumieni log w systemie SVR4 496 Terminalowe wejście-wyjście 388 13.4.2 Technika syslog w systemie 4.3+BSD 498 13.5 Model klient-serwer 502 11.1 Wprowadzenie 388 13.6 Podsumowanie 503 11.2 Informacje podstawowe 388 11.3 Specjalne znaki na wejściu 395 14 11.4 Pobieranie i ustalanie atrybutów terminalu 401 11.5 Sygnalizatory opcji terminalu 402 Komunikacja międzyprocesowa 504 11.6 Polecenie stty 410 14.1 Wprowadzenie 504 11.7 Funkcje związane z szybkością linii 410 14.2 Łącza komunikacyjne 505 11.8 Funkcje do kontroli linii 411 14.3 Funkcje popen oraz pclose 512 11.9 Identyfikacja terminalu 412 14.4 Koprocesy 519 11.10 Tryb kanoniczny 416 14.5 Kolejki FIFO 524 11.11 Tryb niekanoniczny 420 14.6 Metody komunikacji międzyprocesowej Systemu V 528 11.12 Rozmiar okna terminalu 427 14.6.1 Identyfikatory i klucze 528 11.13 termcap, terminf o oraz curses 428 14.6.2 Struktura zawierająca prawa dostępu 530 11.14 Podsumowanie 429 14.6.3 Ograniczenia konfiguracyjne 531 14.6.4 Zalety i wady 531 _12 14.7 Kolejki komunikatów 533 14.8 Semafory 538 Zaawansowane operacje wejścia-wyjścia 431 14.9 Pamięć wspólna 545 12.1 Wprowadzenie 431 14.10 Zagadnienia dotyczące modelu klient-serwer 553 12.2 Nieblokujące wejście-wyjście 431 14.11 Podsumowanie 556 12.3 Ryglowanie rekordów 435 15 __ 12.4 Strumienie 453 12.5 Zwielokrotnianie wejścia-wyjścia 467 Zaawansowane metody komunikacji międzyprocesowej 559 12.5.1 Funkcja select 470 15.1 Wprowadzenie 559- 12.5.2 Funkcja poll 474 15.2 Łącza strumieniowe 559 12.6 Asynchroniczne wejście-wyjście 477 15.3 Przekazywanie deskryptorów pliku 563 12.6.1 System V Wydanie 4 477 15.3.1 System V Wydanie 4 566 12.6.2 System 4.3+BSD 478 15.3.2 System 4.3BSD 568 12.7 Funkcje readv oraz writev 479 15.3.3 System 4.3+BSD 571 12.8 Funkcje readn oraz writen 482 15.4 Serwer otwierający pliki, wersja 1 574 12.9 Wejście-wyjście oparte na odwzorowaniu w pamięci 484 15.5 Funkcje obsługujące połączenia klient-serwer 581 12.10 Podsumowanie 490 15.5.1 System V Wydanie 4 583 15.5.2 System 4.3+BSD 587 Spis treści Spis treści J_£ 19.3 Otwieranie urządzeń pseudoterminalowych 736 15.6 Serwer otwierający pliki, wersja 2 591 19.3.1 System V Wydanie 4 736 15.7 Podsumowanie 600 19.3.2 System 4.3+BSD 739 19.4 Funkcja pty_f ork 741 16 19.5 Program pty 743 Biblioteka funkcji obsługi bazy danych 601 19.6 Zastosowanie programu pty 748 19.7 Dodatkowe możliwości 756 16.1 Wprowadzenie 601 19.8 Podsumowanie 757 16.2 Historia 601 16.3 Biblioteka 602 16.4 Przegląd implementacji 604 Dodatek A 16.5 Obsługa scentralizowana lub zdecentralizowana 608 Prototypy funkcji 759 16.6 Współbieżność 610 16.7 Kod źródłowy 612 16.8 Wydajność 635 Dodatek B 16.9 Podsumowanie 640 Różne kody źródłowe 780 _17 B. 1 Nasze pliki nagłówkowe 780 B.2 Procedury obsługi standardowych błędów 783 Komunikacja z drukarką postscriptową 642 17.1 Wprowadzenie 642 Dodatek C 17.2 Komunikacja w trybie PostScript 642 17.3 Buforowanie wydruków 646 Rozwiązania wybranych ćwiczeń 788 17.4 Kod źródłowy 648 17.5 Podsumowanie 671 Bibliografia 819 Skorowidz 825 ^8 Program obsługujący modem 672 18.1 Wprowadzenie 672 18.2 Historia 673 18.3 Projekt programu 674 18.4 Pliki danych 675 18.5 Projekt serwera 679 18.6 Kod źródłowy serwera 680 18.7 Projekt klienta 711 18.8 Kod źródłowy klienta 714 18.9 Podsumowanie 727 \9 Pseudoterminale 729 19.1 Wprowadzenie 729 19.2 Informacje podstawowe 729 Przedmowa Wprowadzenie W niniejszej książce opisuję interfejs programowania w systemie Unix - funkcje systemowe oraz liczne funkcje zawarte w bibliotece standardowej ję- zyka C. Książka jest przeznaczona dla osób piszących programy, które mają być uruchamiane w systemach uniksowych. Jak większość systemów operacyjnych Unix dostarcza wiele usług, z któ- rych mogą korzystać programy: otwarcie pliku, czytanie pliku, uruchomienie nowego programu, zaalokowanie obszaru pamięci, pobranie bieżącego czasu itp. Są one wspólnie nazywane interfejsem funkcji systemowych. Oprócz tego biblioteka standardowa języka C oferuje różne funkcje, które są używane w programach pisanych w języku C (formatowanie drukowanej wartości zmiennej, porównanie dwóch napisów itp.). Interfejs funkcji systemowych oraz procedury biblioteczne są na ogół opi- sywane w częściach 2 i 3 uniksowego podręcznika systemowego (man pages). W tej książce nie będą powielane te fragmenty dokumentacji. Nie ma zresztą tam ani przykładów, ani żadnych uzasadnień, które są tu przedstawione. Standardy systemu Unix Istotny wpływ na rozwój kolejnych wersji systemu Unix w latach osiemdzie- siątych miały różne międzynarodowe standardy, których tworzenie rozpo- częto właśnie wtedy. Do najważniejszych należą: standard ANSI dla języka C, rodzina norm IEEE POSIX (ciągle w trakcie rozwoju) oraz zalecenia doty- czące przenośności - X/Open. Omówiłem tu te wszystkie standardy^_ale nie tylko w sposób formalny. Opisałem je również w odniesj#rri§ć^4fcr$?iłi§?ckJich implementacji - wy- Przedmowa Przedmowa 19 dania 4 Systemu V oraz mającego się ukazać systemu 4.4BSD1. Dzięki temu (Unix Programmer's Manuał), w którym zamierza się pracować, ponieważ udało mi się przedstawić to, czego zazwyczaj brakuje w samym standardzie często odwołuję się do tego podręcznika, opisując niektóre z bardziej specy- i w wielu książkach o nim. ficznych i zależnych od implementacji właściwości. Niemal każdą funkcję, zwykłą lub systemową, przedstawiam wraz z ma- łym, ale kompletnym przykładem programu, dzięki czemu Czytelnik może lizacja książki zobaczyć, jak wyglądają argumenty wywołania i przekazywane wartości. Po- nieważ jednak niektóre z tych małych programów są wymyślone, podaję też Książkę podzieliłem na sześć części. kilka większych (rozdziały 16, 17, 18 i 19), obrazujących rzeczywiste techniki programowania, stosowane na co dzień. 1. Omówienie podstawowych koncepcji programowania uniksowego, Wszystkie przykłady zostały zamieszczone w tekście bezpośrednio z ich pli- wprowadzenie terminologii (rozdz. 1) oraz przedstawienie różnych ków źródłowych. Można je znaleźć w ogólnodostępnym archiwum FTP na stacji działań standaryzacyjnych i różnych implementacji systemu Unix ftp.uu.net, w katalogu published/books/stevens . advprog. tar . Z. (rozdz. 2). Pobrawszy kody źródłowe programów, można je zmieniać i eksperymento- 2. Wejście-wyjście - niebuforowane wejście-wyjście (rozdz. 3), własno- wać z nimi w konkretnych systemach operacyjnych. ści plików i katalogów (rozdz. 4), standardowa biblioteka wejścia- -wyjścia (rozdz. 5) oraz standardowe pliki systemowe (rozdz. 6). 3. Procesy - środowisko procesu uniksowego (rozdz. 7), sterowanie procesami (rozdz. 8), relacje między różnymi procesami (rozdz. 9) Systemy stosowane do sprawdzenia przykładów oraz sygnały (rozdz. 10). 4. Rozszerzone informacje na temat wejścia-wyjścia - obsługa wejścia- Niestety, wszystkie systemy operacyjne nadal się rozwijają i powstają coraz -wyjścia terminalu (rozdz. 11), złożone właściwości wejścia-wyjścia to nowsze ich wersje. Unix nie jest wyjątkiem. Na poniższym diagramie pre- (rozdz. 12), procesy-demony (rozdz. 13). zentuję kolejne wersje Systemu V oraz 4.xBSD. 5. Techniki IPC - metody komunikacji międzyprocesowej (rozdz. 14 i 15). 6. Przykłady - biblioteka bazy danych (rozdz. 16), komunikacja z dru- 4.3+BSD karką pracującą zgodnie ze standardem Postscript (rozdz. 17), pro- gram obsługi modemu (rozdz. 18) oraz stosowanie pseudoterminali 4.3BSD 4.3BSD Tahoe 4.3BSD Reno 4.4BSD ? (rozdz. 19). BSD Net 1 BSD Net 2 Do zrozumienia materiału zawartego w tej książce przyda się umiejęt- 1986 1987 1988 1989 1990 1991 1992 ność programowania w języku C oraz znajomość ogólnych zasad funkcjono- t t wania systemów uniksowych. Nie trzeba natomiast mieć praktyki w progra- SVR3.0 SYR3.1 SYR3.2 SVR4 mowaniu uniksowym. Jednym słowem, książka ta jest przeznaczona dla pro- XPG3 ANSIC POSIX.l gramistów obytych z systemem Unix oraz innymi systemami operacyjnymi, którzy chcą poznać szczegóły dotyczące usług dostarczanych przez większość systemów uniksowych. Pod nazwą 4.xBSD kryją się różne systemy tworzone przez grupę ba- dawczą Computer Systems Research Group at the University of California at Berkeley. Grupa ta udostępnia również wersje systemów BSD Net 1 i BSD kłady w tekście Net 2 - publicznie dostępny kod źródłowy systemów 4.xBSD. Nazwa SVRx odnosi się do wydania x Systemu V powstałego w firmie AT&T. XPG3 to W książce jest wiele przykładów w języku C - ok. 10000 wierszy kodu źró- wydanie 3 dokumentu X/Open Portability Guide, czyli przewodnika na temat dłowego - przy czym ten kod jest zgodny z normą ANSI C. Przy czytaniu przenośności, a ANSI C to nazwa standardu ANSI języka C. POSIX.l jest książki warto mieć pod ręką podręcznik programowania w systemie Unix standardem IEEE oraz ISO dla interfejsu do systemu o cechach Uniksa. Wię- cej informacji na temat tych standardów oraz ich kolejnych wersji Czytelnik 1 W czasie pisania książki system 4.4BSD był dopiero zapowiadany (przyp. tłum.). znajdzie w podrozdziałach 2.2 i 2.3.