rukovet programatora v os unix
Transkript
PEDAGOGICKÁ FAKULTA UNIVERZITY JANA EVANGELISTY PURKYNĚ Rukovět programátora v Unixu Jiřı́ Fišer MM 2 Rukověť programátora v Unixu 1. Úvod Vážený čtenáři, tato kniha je určena pro programátory, kteřı́ chtějı́ vytvářet aplikačnı́ programy v Unixu, a to předevšı́m v jeho dnes nejrozšı́řenějšı́ implementaci, v Linuxu. Rukovět’programátora v Unixu je tématicky řazeným přehledem nejčastěji použı́vaných služeb jádra operačnı́ho systému a souvisejı́cı́ch standardnı́ch knihovnı́ch funkcı́. 1.1. Nezařazené skupiny funkcí Do této publikace nejsou zařazeny tyto skupiny funkcı́ : Knihovnı́ funkce použı́vané často i na jiných platformách (vyučované v základnı́m kursu jazyka C) tj. funkce standardnı́ho vstupu a výstupu, funkce pro práci s proudy (streams), standardnı́ funkce pro alokaci paměti (malloc), funkce pro práci s řetězci a znaky (string.h, ctype.h). Funkce pro práci se semafory, sdı́lenou pamětı́ a thready (rozsahem teorie a programových konstrukcı́ vybočujı́cı́ z rozsahu brožury)1 . Sı́t’ové služby (TCP/IP, sokety), které si také žádajı́ odděleného zpracovánı́. Služby a funkce nı́zké úrovně, jejichž funkčnost je pokryta vyššı́mi a přenositelnějšı́mi funkcemi, resp. funkce a služby, jež jsou využı́vány pouze při programovánı́ modulů jádra, ovladačů apod. 1.2. Přenositelnost Preferovány jsou funkce dle normy POSIX, jež by měli být použitelné ve všech modernı́ch implementacı́ch UNIXu i v některých neunixovských operačnı́ch systémech. Pouze v přı́padě, že POSIX danou funkci nespecifikuje, jsou preferovány systémové funkce BSD Unixu. Přenositelnost je vždy uvedena vpravo u prototypu funkce. Jsou použity tyto zkratky: POSIX – norma POSIX (standardnı́ rozhranı́ UNIX-like operačnı́ch systémů) (POSIX.1,POSIX.3) BSD – funkce (služby) implementované v BSD Unixu SVID – funkce podporované UNIXem System V (SVID verze 2) UNIX – funkce z původnı́ho Unixu (verze 7), tudı́ž použitelné ve všech Unixech (implikuje tedy i BSD, SVID a X/OPEN nikoliv však POSIX) ANSI C – funkce popsané v ANSI/ISO C normě (obecné funkce jazyka C použitelné na všech platformách). U ANSI C funkcı́ nejsou uváděny souběžné definice v ostatnı́ch normách a prostředı́ch. X/OPEN – norma konsorcia X/OPEN. GNU – funkce (služba) přı́stupná pouze v GNU knihovně glibc. Ukázkové programy splňujı́ normu ANSI C (rozšı́řenı́ modernı́ch C-kompilátorů nejsou použita). 1.3. Požadované předběžné znalosti Programovánı́ běžných aplikacı́ v jazyce C, syntaxe a sémantika jazyka C, základnı́ teorie operačnı́ch systémů (multitasking, souborový systém). 1 připravuji však skripta věnovaná této problematice 1 3 ÚVOD 1.4. Struktura hesla Každý popis funkce nebo služby má jednotnou úpravu, jı́ž lze znázornit následujı́cı́ šablonou. prototyp funkce 0 hlavičkové soubory, v nichž je deklarována funkce a pomocné objekty krátký popis funkce popis hlavnı́ch parametrů návratová hodnota : popis návratové hodnoty funkce poznámka : přenositelnost 4 2. Rukověť programátora v Unixu Parametry příkazového řádku a prostředí int getopt (int argc, char * const argv[], const char *optstring) 1 POSIX.2 unistd.h int getopt long (int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex) 2 GNU unistd.h,getopt.h Knihovnı́ funkce zajišt’ujı́cı́ zpracovánı́ voleb (options) přı́kazového řádku. Funkce getopt zpracovává standardnı́ jednoznakové volby (včetně jejich skupin) (např. -v, -axl apod.). Funkce getopt long navı́c zpracovává i dlouhé (vı́ceznakové volby) uvozené dvojznakem -- (např. --color, --sort, apod.). Komunikace mezi programem a funkcı́ getopt resp. getopt long se kromě parametrů a návratové hodnoty děje i pomocı́ několika globálnı́ch proměnných, jejichž definice (uvedené v unistd.h) jsou následujı́cı́: extern char *optarg; extern int optind, opterr, optopt; Jako prvnı́ dva parametry funkce getopt se vždy uvádějı́ přı́slušné pseudoparametry metody main (argv, argc). Třetı́ parametr optstring obsahuje všechny přı́pustné (jednoznakové) volby. Znak volby následovaný dvojtečkou označuje volby s parametrem. Napřı́klad optstring "d:vAlf:" může zpracovat následujı́cı́ volby na přı́kazovém řádku -A -vlf m.txt -d + . Funkce při každém svém volánı́ zpracovává jednu volbu z přı́kazového řádku. Mohou nastat tři základnı́ situace. (popis je poněkud zjednodušen) 1. je nalezena přı́pustná volba : funkce vracı́ znak volby a tentýž znak vložı́ do optopt, je-li očekáván parametr volby je ukazatel na něj vložen do globálnı́ proměnné optarg. 2. je nalezena nepřı́pustná volba : funkce vracı́ znak ’?’, do optopt je vložen nepřı́pustný znak volby. Ostatnı́ proměnné jsou nedefinovány. Je-li opterr nenulové, je navı́c vypsáno hlášenı́ na standardnı́ chybový výstup. 3. jsou zpracovány všechny volby (resp. poslednı́ volba před argumentem) : funkce vracı́ hodnotu EOF. Proměnná optind je nastavena na index prvnı́ho nezpracovaného řetězce z argv. Je-li tedy optind menšı́ než argc, pak za volbami následujı́ dalšı́ parametry. Funkce getopt long použı́vá pro krátké parametry shodný mechanismus, navı́c však pomocı́ parametrů longopts, longindex umožňuje zpracovávat i parametry dlouhé (vı́ceznakové). Parametr longopts je ukazatelem na pole struktur popisujı́cı́ch jednotlivé dlouhé volby. Deklarace popisné struktury struct option je následujı́cı́: struct option { const char *name; int has_arg; int *flag; int val; }; kde name je jméno volby, has arg určuje zda je volba bez parametru (hodnota 0), s povinným parametrem (hodnota 1) nebo s parametrem volitelným (hodnota 2). Parametr flag určuje, zda bude hodnota val vrácena jako návratová hodnota funkce getopt long (je-li flag rovno NULL) nebo zda bude 2 PARAMETRY PŘÍKAZOVÉHO ŘÁDKU A PROSTŘEDÍ 5 na hodnotu val nastavena pamět odkazovaná ukazatelem flag, přičemž v tomto přı́padě bude funkcı́ getopt long vrácena hodnota 0. Poslednı́m prvkem pole musı́ být prázdná (vynulovaná) struktura. V praxi by funkce getopt long měla u dlouhých voleb vracet hodnotu 0. Pouze v přı́padě ekvivalence dlouhé a krátké volby může být vrácena hodnota přı́slušná volbě krátké (tj. znak krátké volby). Pro identifikaci dlouhé volby je možno použı́t poslednı́ parametr longindex, což je výstupnı́ referenčnı́ parametr obsahujı́cı́ po návratu z funkce index do tabulky longopts. char * getenv (const char *name) 3 ANSI C stdlib.h Knihovnı́ funkce zjišt’ujı́cı́ hodnotu proměnné prostředı́ (často jı́ bývá proměnná shellu). Parametrem je řetězec se jménem hledané proměnné. poznámka : Proměnné prostředı́ jsou definovány ve speciálnı́m datovém segmentu ve tvaru proměnná=hodnota, kde proměnná i hodnota majı́ tvar řetězce (proměnná navı́c nesmı́ obsahovat mezeru, či jiný bı́lý znak). návratová hodnota : Funkce vracı́ ukazatel na hodnotu přı́slušnou dané proměnné, nebo NULL pokud proměnnou v prostředı́ nenalezne. Nenulový ukazatel ukazuje přı́mo do prostředı́ (nedojde k žádné duplikaci), pročež je jej nutno chápat jako read-only. int putenv (const char*string) 4 SVID stdlib.h Knihovnı́ funkce vytvářejı́cı́ novou proměnnou prostředı́ nebo měnı́cı́ již existujı́cı́. Parametr string musı́ mı́t tvar proměnná=hodnota, jenž určuje jak nastavovanou proměnnou tak hodnotu. Jestliže již stejnojmenná proměnná prostředı́ existuje, je změněna jejı́ hodnota, neexistuje-li, jest vytvořena nová. poznámka : Nastavenı́ proměnné prostředı́ je platné pouze v aktuálnı́m procesu a synovských procesech vytvořených po jejı́m nastavenı́. Neprojevı́ se v žádném přı́padě v procesu rodičovském (tj. např. v shellu). V BSD Unixu (a Linuxu) lze užı́t sofistikovanějšı́ funkce setenv. návratová hodnota : Při úspěchu 0, jinak −1 6 3. 3.1. Rukověť programátora v Unixu Soubory Otevření a vytvoření souboru int open (const char * filename, int type) POSIX,UNIX 5 sys/types.h, sys/stat.h, fcntl.h Otevřenı́ souboru se jménem f ilename. V přı́padě že soubor neexistuje, je před otevřenı́m vytvořen. type – mód otevřenı́ O RDONLY O WRONLY O RDWR O TRUNC O CREAT O EXCL – otevřı́t pouze pro čtenı́ – otevřı́t pouze pro zápis – otevřı́t pro zápis i čtenı́ – otevřený soubor je zkrácen na nulovou délku – pokud soubor neexistuje, je vytvořen – je-li uveden s O CREAT, způsobı́ chybu pokud soubor již existuje návratová hodnota : Deskriptor souboru (malé celé čı́slo) tj. index do tabulky otevřených souborů procesu. V přı́padě neúspěchu je vrácena hodnota −1. poznámka : Přı́stupová práva jsou implicitně nastavena na 0777 && ˜umask. int creat (const char * filename, int mode) 6 POSIX,UNIX sys/types.h, sys/stat.h, fcntl.h Vytvořenı́ nového souboru se jménem f ilename a jeho otevřenı́. Pokud soubor již existuje, je zkrácen na nulovou délku. Soubor je otevřen pro zápis na počátek. mode – požadovaná přı́stupová práva (finálnı́ přı́stupová práva ≡ mode && ˜umask) návratová hodnota : Deskriptor souboru (malé celé čı́slo), tj. index do tabulky otevřených souborů procesu. V přı́padě neúspěchu je vrácena hodnota −1. int close (int fd) POSIX,UNIX 7 unistd.h Uzavřenı́ souboru s deskriptorem otevřeného souboru fd. návratová hodnota : 0 při úspěchu, −1 při neúspěchu (málo pravděpodobné). mode t umask (int mask) 8 POSIX,UNIX sys/types.h, sys/stat.h Nastavenı́ masky přı́stupových práv. Tato maska ovlivňuje nastavenı́ přı́stupových práv všech vytvářených souborů. mask – oktalová maska přı́stupových práv 0000 – jsou použita práva specifikovaná při otevřenı́ (resp. implicitnı́) 0777 – soubory nebudou mı́t nastaveno žádné přı́stupové právo 0177 – soubory mohou mı́t pouze právo čtenı́ a zápisu uživatelem apod. To jest, je-li bit masky jedničkový, právo nebude v žádném přı́padě nastaveno. 3 7 SOUBORY návratová hodnota : původnı́ hodnota masky (lze ji tedy použı́t pro zı́skánı́ aktuálnı́ hodnoty masky přı́stupových práv, přičemž však toto řešenı́ nenı́ reentrantnı́). V GNU systémech lze (reentrantně) zı́skat masku službou getumask. 3.2. Přístup k souboru (čtení, zápis) int access (const char * filename, int amode) 9 POSIX,UNIX unistd.h Zjištěnı́ práv, která má volajı́cı́ proces k souboru specifikovanému jménem filename. amode – testované přı́stupové právo (práva lze kombinovat pomocı́ bitového operátoru or [ | ]) R W X F OK OK OK OK – právo čtenı́ – právo zápisu – právo spuštěnı́ – kontroluje se pouze existence souboru pro proces (tj. právo přı́stupu ke jménu souboru) návratová hodnota : 0 v přı́padě úspěchu (soubor existuje a proces má dané právo), −1 v přı́padě neúspěchu. int read (int fd, char * buf, size t count) 10 size t write (int fd, char * buf, size t count) 11 POSIX,UNIX unistd.h Čtenı́ (resp. zápis) bloku dat z (resp. do) otevřeného souboru s deskriptorem fd. buf (read) – ukazatel do oblasti paměti určené pro přečtená data (pamět’musı́ být předem alokována a to v dostatečném rozsahu). buf (write) – ukazatel do paměti s daty určenými pro zápis count – počet bytů čtených (resp. zapisovaných) dat návratová hodnota : Počet skutečně přečtených (resp. zapsaných) bloků dat (tj. 0 až count) nebo -1 v přı́padě chyby. off t lseek (int fd, off t offset, int whence) 12 posix.1,unix unistd.h, sys/stat.h Služba posouvá ukazatel aktuálnı́ pozice (file pointer) v otevřeném souboru, jenž je identifikován deskriptorem fd, na pozici určenou parametry offset a whence. offset – posunutı́ nového ukazatele v bytech od pozice určené parametrem whence (ve směru ke konci souboru). Hodnota může být i záporná. whence – počátek posunutı́, může nabývat následujı́cı́ch hodnot : SEEK SET – počátek souboru SEEK CUR – aktuálnı́ (stará pozice) souborového ukazatele SEEK END – konec souboru návratová hodnota : Nová pozice souborového ukazatele (měřena v bytech od počátku souboru). Pomocı́ volánı́ lseek(fd,0,SEEK CUR) lze zı́skat aktuálnı́ pozici souborového ukazatele. poznámka : volánı́ lze použı́t pouze u souborů a zařı́zenı́ s náhodným přı́stupem (bloková zařı́zenı́) 8 Rukověť programátora v Unixu int ftruncate (int fd, off t length) POSIX 13 unistd.h Zkrácenı́ otevřeného souboru na délku length bytů. Je-li soubor kratšı́ nic se neprovede. návratová hodnota : 0 při úspěchu, −1 při neúspěchu 3.3. Deskriptory otevřených souborů FILE * fdopen (int fd, char * mode) 14 POSIX stdio.h Otvı́rá datový proud (stream) spojený s otevřeným souborem, (identifikován deskriptorem fd). Prostřednictvı́m tohoto volánı́ lze k souboru otevřenému pomocı́ open přistupovat jako k datovému proudu. mode – mód datového proudu (r,w,r+,w+), který musı́ být kompatibilnı́ s typem uvedeným ve službě open. návratová hodnota : Ukazatel na strukturu datového proudu (FILE*) nebo NULL v přı́padě neúspěchu. int fileno (FILE * stream) POSIX 15 stdio.h Funkce vracı́ deskriptor otevřeného souboru, jenž je spojen s (otevřeným) datovým proudem stream. int dup (int oldfd) 16 int dup2 (int oldfd, int newfd) POSIX,UNIX 17 posix.1 unistd.h Obě volánı́ duplikujı́ (kopı́rujı́) deskriptor otevřeného souboru v tabulce otevřených souborů procesu. Volánı́ dup kopı́ruje deskriptor na nejnižšı́ volnou pozici v této tabulce, volánı́ dup2 umožňuje cı́lovou pozici specifikovat (pokud nenı́ tato pozice volná je původnı́ deskriptor uzavřen). Nově otevřený deskriptor sdı́lı́ se starým tyto vlastnosti : otevřený soubor nebo zařı́zenı́, ukazatel aktuálnı́ pozice v souboru, přı́stupový režim (read, write, atd.) Volánı́ se použı́vá pro implementaci přesměrovánı́ standardnı́ho vstupu a standardnı́ch výstupů. návratová hodnota : Služba dup vracı́ při úspěchu nový (cı́lový) deskriptor, zatı́mco úspěšné volánı́ dup2 vracı́ 0. Neúspěch je u obou služeb signalizován hodnotou −1. 3.4. Paralelní (asynchronní) přístup int select (int n, fd set *readfds, fd set *writefds, fd set *exceptfds,struct timeval *timeout) 18 BSD sys/types.h, sys/time.h, unistd.h Služba čekajı́cı́ na událost na jednom nebo na několika deskriptorech otevřených souborů, jež jsou spojeny s některým z meziprocesových komunikačnı́ch kanálů (roury, schránky) nebo se speciálnı́m souborem znakového zařı́zenı́ (konzole, sériový port). Proces je během čekánı́ zablokován. Událostı́ může být zápis do komunikačnı́ho kanálu jiným procesem nebo vstupnı́m zařı́zenı́m (readfds), uvolněnı́ výstupnı́ho zařı́zenı́ nebo komunikačnı́ho kanálu, čı́mž je umožněn zápis na tento deskriptor (writefds), nebo vznik chyby na zařı́zenı́ spojeném s deskriptorem (exceptfds). 3 9 SOUBORY Nastane-li specifikovaná událost na jednom ze strážených deskriptorů, volánı́ služby se ukončı́ a vrátı́ informace nutné pro následné ošetřenı́ této události (čtenı́, zápis, uzavřenı́ deskriptoru). Nenastane-li žádná ze specifikovaných událostı́, služba se ukončı́ po uplynutı́ čekacı́ doby (timeoutu), je-li tato určena, jinak zůstává proces zablokován ve volánı́ služby navždy. n – hodnota nejvyššı́ho hlı́daného deskriptoru (platı́ pro všechny tři skupiny deskriptorů) readfds – ukazatel na bitovou masku určujı́cı́, které deskriptory otevřené pro čtenı́ budou hlı́dány (událost zápis na tento deskriptor). Po úspěšném návratu z funkce jsou nastaveny bity přı́slušné deskriptorům, na nichž došlo k očekávané události. writefds – ukazatel na bitovou masku určujı́cı́, které deskriptory otevřené pro zápis budou hlı́dány (událost uvolněnı́ výstupnı́ho kanálu). Po úspěšném návratu z funkce jsou nastaveny bity přı́slušné deskriptorům na nichž došlo k očekávané události. exceptfds – ukazatel na bitovou masku určujı́cı́, které deskriptory budou hlı́dány (událost vznik asynchronnı́ chyby). Po úspěšném návratu z funkce jsou nastaveny bity přı́slušné deskriptorům na nichž došlo k očekávané události. timeout – je-li parametr různý od NULL odkazuje na strukturu timeval určujı́cı́ maximálnı́ čekacı́ dobu v sekundách (timeout→tv sec) a milisekundách (timeout→tv usec), po které je volánı́ ukončeno. Při parametru rovném NULL nebude funkce předčasně ukončena uplynutı́m timeoutu. návratová hodnota : Počet nastavených (splněných) deskriptorů (v přı́padě timeoutu je roven 0) nebo −1 v přı́padě chyby (obsahy všech bitových polı́ deskriptorů mohou mı́t v tomto přı́padě náhodnou hodnotu) poznámka : bitovou masku určujı́cı́ hlı́dané deskriptory lze snadno nastavit a testovat pomocı́ následujı́cı́ch maker. FD ZERO (fd set *set) – nuluje všechny bity pole FD CLR (int fd, fd set *set) – nuluje bit specifikovaný deskriptorem FD SET (int fd, fd set *set) – nastavuje bit specifikovaný deskriptorem (tj. určuje, že deskriptor bude hlı́dán) FD ISSET (int fd, fd set *set) – testuje zda je specifikovaný deskriptor nastaven (voláno po návratu ze služby) 3.5. Mapování souborů do virtuální paměti void * mmap (void *address, size t length, int protect, int flags, int fd, off t offset) 19 POSIX unistd.h,sys/mman.h Funkce mapuje úsek otevřeného souboru s deskriptorem fd začı́najı́cı́ na pozici offset s délkou length na virtuálnı́ adresu address. address – pomocı́ tohoto parametru lze ovlivnit umı́stěnı́ mapovaného souboru ve virtuálnı́ paměti. To je však v praxi prakticky nepoužitelné (aplikačnı́ programátor nespravuje virtuálnı́ adresový prostor) a tak se nejčastěji využı́vá hodnota NULL, která svěřı́ umı́stěnı́ operačnı́mu systému. length – délka mapovaného úseku v bytech. Tuto velikost nelze v žádném přı́padě překročit (jinak je vyvolán segmentation fault). Délka by měla být u 32 bitových systémů maximálně v rozsahu desı́tek megabytů. 10 Rukověť programátora v Unixu protect – určuje práva procesu k mapovanému souboru (paměti). Jsou určena konstantami PROT READ (právo ke čtenı́), PROT WRITE (právo k zápisu) a PROT EXEC (právo ke spuštěnı́) a musı́ být kompatibilnı́ s modem otevřeného souboru. Na některých systémech platı́, že PROT WRITE implikuje PROT READ a PROT EXEC je shodný s PROT WRITE (také tato implikovaná práva musı́ být kompatibilnı́ s modem souboru a zprostředkovaně jeho přı́stupovými právy). flags – Přı́znak určujı́cı́ typ mapovánı́. Je nutno zvolit bud’ MAP PRIVATE, jenž je rychlejšı́, ale při sdı́lenı́ přı́stupu k souboru nezajišt’uje konzistenci, nebo MAP SHARED, které si vynucuje průběžné ukládánı́ změn, jenž ale zjišt’uje konzistenci při sdı́lenı́. fd – deskriptor otevřeného souboru. Mapovat lze toliko běžné souboru. návratová hodnota : Vracı́ bud’ adresu mapovacı́ oblasti, nebo −1 při neúspěchu. int munmap void * addr, size t length POSIX 20 unistd.h,sys/mman.h Odmapuje všechny mapovacı́ oblasti v daném segmentu virtuálnı́ paměti. Odmapovat lze najednou vı́ce mapovacı́ch oblastı́, pouhé části mapovacı́ch oblastı́ a v segmentu mohou existovat i nemapované oblasti. Tuto benevolenci však nenı́ radno přı́liš zneužı́vat. návratová hodnota : 0 při úspěchu, jinak −1. void * mremap (void *adress,size t length,size t new length,int flag) 21 POSIX unistd.h,sys/mman.h Funkce pro změnu velikosti mapovaného úseku z velikosti length na velikost new length. Je-li flag roven hodnotě MREMAP MAYMOVE může být nová mapovacı́ oblast alokována na jiné virtuálnı́ adrese. Při zvětšovánı́ souboru je nutná spolupráce se službou ftruncate. návratová hodnota : adresa nové mapovacı́ oblasti nebo −1 při neúspěchu. 3.6. Uzamykání souborů int fcntl (int fd, int command, struct flock* lock) 22 POSIX sys/file.h Obecná služba, která pro hodnoty (F GETLK), F SETLK, F SETLKW parametru command zajišt’uje zamykánı́ resp. odemykánı́ částı́ souboru s deskriptorem fd. Jedná se pouze o doporučený zámek, proto procesy nemusı́ zámek použı́vat ani na něj brát ohled. Kooperujı́cı́ procesy však mohou volat explicitně službu pro nastavenı́ zámku a tak se mohou v přı́padě možné kolize dobrovolně zablokovat. Podporovány jsou navı́c dva typy zámků, zámek exkluzivnı́ (použı́vaný při zápisu), jenž může být na danou oblast aplikován pouze jednou a zámek sdı́lený (použı́vaný při čtenı́), který lze aplikovat na stejnou oblast vı́cekrát, přičemž se však vzájemně vylučuje s zámkem exkluzivnı́m (tj. nemohou být oba aplikovány na stejnou oblast.) Druh a rozsah zámku je učen položkami struktury struct flock, jež obsahuje následujı́cı́ členy: l type druh zámku F RDLCK (sdı́lený), F WRLCK (exkluzivnı́), resp. speciálnı́ hodnota F UNLCK, jenž je použı́vána při odstraňovánı́ zámku nad jistou oblastı́. l whence pozice od nı́ž je počı́tán začátek oblasti. Odpovı́dá stejnojmennému parametru služby lseek včetně sémantiky přı́pustných hodnot. 3 SOUBORY 11 l start začátek oblasti zámku daný bytovým posunutı́m od whence l len délka oblasti v bytech, je-li zadána 0 je zámek aplikován až do konce souboru. Podslužba (command) F SETLK nastavuje (rušı́) zámek bez zablokovánı́ (nenı́-li operace možna tj. pokud zámek již existuje) vracı́ se ihned s chybovou hodnotou. V praxi se však použı́vá předevšı́m při rušenı́ zámků. Naopak podslužba F SETLKW se zablokuje až do okamžiku kdy je možno operaci provést (tj. nejčastěji do okamžiku uvolněnı́ zamykané oblasti) a je proto vhodná pro zamykánı́. Při zamykánı́ jsou zohledněny vlastnı́ci zámků. Při pokusu znovu uzamknout oblast vlastnı́kem předchozı́ho zámku nedojde k uváznutı́, ale oblast je uzamčena novým zámkem (stejně je tomu i při částečném přesahu zámků). návratová hodnota : 0 v přı́padě úspěchu, −1 při neúspěchu. 12 Rukověť programátora v Unixu 4. Souborový systém 4.1. Informace o souboru int stat (const char * filename, struct stat * buffer) 23 int fstat (int fd, struct stat * buffer) 24 int lstat (const char * filename, struct stat * buffert) 25 POSIX,UNIX BSD,SVID sys/stat.h, unistd.h Funkce zjišt’ujı́cı́ vlastnosti a atributy specifikovaného souboru. U funkce fstat je soubor určen deskriptorem otevřeného souboru u funkcı́ stat a lstat jménem (nemusı́ být tedy otevřen). Jsou-li funkce stat a f stat použity na symbolický odkaz (link), vracı́ informaci o odkazovaném souboru (tj. link je pro ně transparentnı́). Pro zı́skánı́ informacı́ o vlastnı́m linku je nutné použı́t službu lstat. Pro ostatnı́ soubory jsou volánı́ stat a lstat identická. buffer – předem alokovaná oblast paměti do nı́ž jsou ukládány informace o souboru ve formátu daném strukturou struct stat : struct stat { dev_t st_dev; /* zařízení */ ino_t st_ino; /* číslo i-uzlu*/ umode_t st_mode; /* typ souboru a přístupová práva */ nlink_t st_nlink; /* počet pevných odkazů (hard links)*/ uid_t st_uid; /* ID uživatele - vlastníka souboru */ gid_t st_gid; /* ID skupiny - vlastníka souboru*/ dev_t st_rdev; /* typ zařízení*/ off_t st_size; /* celková velikost v bytech */ unsigned long st_blksize; /* velikost elementárního bloku souborového systému */ unsigned long st_blocks; /* počet alokovaných bloků */ time_t st_atime; /* čas posledního přístupu (UNIX formát času)*/ time_t st_mtime; /* čas poslední modifikace souboru*/ time_t st_ctime; /* čas poslední změny atributů*/ }; v položce st mode jsou v bitovém poli uloženy informace o typu souboru a přı́stupových právech. Pro snadnějšı́ přı́stup k těmto informacı́m lze použı́t maker a bitových masek (ty lze spojovat operátorem | a testovat operátorem &) makra S S S S S S S ISLNK (st mode) je soubor symbolickým odkazem (symbolic link) ? ISREG (st mode) obyčejným souborem? ISDIR (st mode) adresářem? ISCHR (st mode) znakovým zařı́zenı́m? ISBLK (st mode) blokovým zařı́zenı́m? ISFIFO (st mode) pojmenovanou rourou (fifo)? ISSOCK (st mode) schránkou (socket)? 4 13 SOUBOROVÝ SYSTÉM bitové masky speciálnı́ bity S ISUID 0004000 set UID bit, S ISGID 0002000 set GID bit, S ISVTX 0001000 sticky bit přı́stupová práva vlastnı́ka S IRUSR 00400 právo čtenı́, S IWUSR 00200 právo zápisu, S IXUSR 00100 právo spuštěnı́ přı́stupová práva skupiny S IRGRP 00040 právo čtenı́, S IWGRP 00020 právo zápisu, S IXGRP 00010 právo spuštěnı́ přı́stupová práva ostatnı́ch uživatelů S IROTH 00004 právo čtenı́, S IWOTH 00002 právo zápisu, S IXOTH 00001 právo spuštěnı́ návratová hodnota : : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu int readlink (const char *filename, char *buf, int bufsize) 26 BSD0,X/OPEN unistd.h Služba zjišt’ujı́cı́ jméno souboru, na nějž odkazuje symbolický link. filename – jméno symbolického linku buf – buffer, do nějž je uloženo jméno odkazovaného souboru (buffer musı́ být alokován před volánı́m služby). bufsize – velikost alokovaného bufferu v bytech návratová hodnota : : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu 4.2. Adresářové služby int chdir (const char *dirname) POSIX,UNIX 27 unistd.h Služba nastavuje adresář dirname jako aktuálnı́ adresář procesu (current directory). návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu char * getcwd (char * buf, size t size) POSIX 28 unistd.h Zjištěnı́ aktuálnı́ho adresáře procesu. buf – mı́sto alokované pro uloženı́ jména aktuálnı́ho adresáře (absolutnı́ cesty) size – velikost alokovaného prostoru v bytech návratová hodnota : Ukazatel na naplněný buffer nebo NULL v přı́padě neúspěchu (nejčastěji z důvodů přı́liš malého bufferu) . int mkdir (const char *dirname, int mode) 29 14 Rukověť programátora v Unixu int rmdir (const char *dirname) POSIX 30 unistd.h, sys/types.h, fcntl.h Vytvářenı́ (mkdir) a mazánı́ (rmdir) adresáře se jménem dirname (jméno může obsahovat absolutnı́ i relativnı́ cestu, ale v každé z těchto cest musı́ existovat všechny adresáře vyjma poslednı́ho). mode – požadovaná přı́stupová práva k novému adresáři (finálnı́ jsou nastavena standardnı́m způsobem jako mode && ˜umask) návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu poznámka : Služba rmdir maže pouze prázdné adresáře. 4.3. Manipulace se soubory int link (const char *oldpath, const char *newpath) 31 int symlink (const char *oldpath, const char *newpath) int rename (const char *oldpath, const char *newpath) POSIX,UNIX 32 33 SVID,BSD ANSI C,POSIX,UNIX unistd.h Skupina funkcı́ pro vytvářenı́ pevného odkazu (link), symbolického odkazu (symlink) nebo pro přesunutı́ souboru (rename). Nový soubor (resp. odkaz) se může nacházet na libovolném mı́stě adresářového stromu (pouze u pevného odkazu se musı́ původnı́ soubor i odkaz nacházet na stejném svazku (volume)). oldpath – jméno starého souboru (zdroj) newpath – jméno nového souboru resp. odkazu (cı́l) návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu int unlink (const char * filename) 34 int remove (const char * filename) 35 ANSI C,POSIX,UNIX unistd.h Obě funkce odstraňujı́ jméno běžného souboru (filename) ze souborového systému. Důsledkem je snı́ženı́ počtu odkazů na tento (fyzický) soubor o jeden (tj. odstraněnı́ jednoho pevného odkazu). Je-li výsledný počet odkazů nulový, je soubor fyzicky odstraněn (tj. jsou uvolněny jeho datové bloky). Funkce remove maže kromě běžných souborů i adresáře (v tomto přı́padě funguje stejně jako rmdir. návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu 4.4. Vlastnictví a práva int chmod (const char *filename, mode t mode) int fchmod (int desc, mode t mode) 37 POSIX,UNIX 36 BSD,SVID sys/types.h, sys/stat.h Nastavenı́ přı́stupových práv u souboru filename resp. u otevřeného souboru s deskriptorem desc. mode – přı́stupová práva ve standardnı́ unixovské oktalové notaci návratová hodnota : 0 v přı́padě úspěchu, −1 při neúspěchu int chown (const char *filename, uid t uid, gid t gid) 38 POSIX,UNIX 4 15 SOUBOROVÝ SYSTÉM okruh uživatelů / přístup. právo vlastník (user) skupina (group) ostatní (other) čtení (R) 0400 0040 0004 zápis (W) 0200 0020 0002 provádění (X) 0100 0010 0001 Tabulka 1: Přístupová práva int fchown (int desc, uid t uid, gid t gid) 39 BSD,SVID sys/types.h, unistd.h Služba měnı́cı́ vlastnı́ka a skupinového vlastnı́ka u souboru filename, resp. u otevřeného souboru s dekriptorem desc. V modernı́ch UNIXech může vlastnı́ka souboru měnit pouze superuživatel. Běžnı́ uživatelé (tj. jejich procesy) mohou měnit pouze skupinu a to pouze tehdy, jsou-li členem nově nastavované skupiny. uid – UID (user id) nového vlastnı́ka nebo −1 v přı́padě, že změna nenı́ požadována. gid – GID (group id) nového skupinového vlastnı́ka nebo −1 v přı́padě, že změna nenı́ požadována. návratová hodnota : 0 v přı́padě úspěchu, −1 při neúspěchu 4.5. Čtení obsahu adresáře DIR * opendir (const char * dirname) 40 POSIX sys/types.h, dirent.h Služba otvı́rá adresářový proud (obdoba datového proudu), jenž je spojen s adresářem (souborem typu adresář) dirname. Adresářový proud umožňuje přı́stup k obsahu adresáře (tj. ke jménům souborům a jejich i-čı́slům). návratová hodnota : Ukazatel na strukturu adresářového proudu v přı́padě úspěchu, NULL při neúspěchu. struct *dirent readdir (DIR *dir) 41 POSIX sys/types.h, dirent.h Čtenı́ položky adresáře z otevřeného adresářového proudu dir. Služba navı́c posune ukazatel aktuálnı́ pozice na dalšı́ položku adresáře. návratová hodnota : V přı́padě úspěchu vracı́ funkce ukazatel na strukturu dirent, jež je vyplněna údaji o aktuálnı́ položce adresáře (tj. údaji o jistém souboru v adresáři), nebo NULL v přı́padě neúspěchu. definice struktury struct dirent (nenı́ zcela přenositelná, POSIX předepisuje pouze položku d name) struct dirent { long unsigned char char }; d_fileno; /*číslo i-uzlu (i-number)*/ d_namelen; /*délka jména souboru*/ d_name[256]; /*jméno souboru */ poznámka : Funkce readdir nenı́ reentrantnı́. Ve vı́cevláknovém prostředı́ je nutno použı́t jejı́ reentrantnı́ verze readdir r. 16 Rukověť programátora v Unixu void rewinddir (DIR *dir) POSIX 42 sys/types.h, dirent.h Služba nastavuje ukazatel aktuálnı́ pozice v adresářovém proudu na jeho začátek. Adresářový proud tak lze znovu zpracovávat. int closedir (DIR *dir) POSIX 43 sys/types.h, dirent.h Funkce uzavı́rá adresářový proud dir. návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu 4.6. Roury int pipe (int filedes [2]) POSIX,UNIX 44 unistd.h Služba vytvářı́ nepojmenovanou rouru, otvı́rá jejı́ oba konce, přičemž deskriptor přı́slušný vstupnı́mu konci roury (určenému pro čtenı́, vstupnı́mu z hlediska procesu) je uložen do položky filedes[0], deskriptor přı́slušný výstupnı́mu konci (určenému pro zápis, výstupnı́mu z hlediska procesu) je uložen do položky filedes[1]. návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu poznámka : Roura je destruována, pokud neexistuje žádný proces čtenář (tj. všechny procesy sdı́lejı́cı́ rouru uzavřely čtecı́ deskriptor) nebo pokud neexistuje žádný proces zapisovatel (tj. všechny procesy uzavřely zapisovacı́ deskriptor). int mkfifo (const char * pathname, mode t mode) POSIX 45 sys/stat.h Služba vytvořı́ pojmenovanou rouru (FIFO), jež bude identifikována jménem pathname, což je formálně souborové jméno s přı́padnou cestou. Přı́stupová práva roury jsou nastavena standardnı́m způsobem jako mode && ˜umask. návratová hodnota : 0 v přı́padě úspěchu, -1 v přı́padě neúspěchu poznámka : Na rozdı́l od nepojmenované roury nejsou oba konce roury explicitně otevřeny a tak se musı́ otevřı́t explicitně volánı́m open. Pojmenovaná roura také nenı́ automaticky destruována a je nutno tak učinit např. volánı́m remove. int socketpair (int namespace, int style, int protocol, int filedes[2]) 46 BSD sys/socket.h Služba patřı́cı́ do rodiny služeb pro práci s BSD sockety (schránkami), které zajišt’ujı́ lokálnı́ i sı́t’ovou komunikaci na nejnižšı́ aplikaci přı́stupné vrstvě. Tato služba však nenı́ svým charakterem sı́t’ovou a mohou ji využı́t i programátoři neseznámenı́ s problematikou sı́tı́. Služba socketpair totiž vytvářı́ obousměrnou (lokálnı́) rouru a to s rozhranı́m odpovı́dajı́cı́m klasické službě pipe tj. ukládá deskriptory obou konců roury do pole filedes. Oba konce jsou však schopné čtenı́ i zápisu a tak mohou dat proudit oběma směry. Při obousměrné komunikaci mezi dvěma procesy (nejčastěji předkem a potomkem) tak stačı́ vytvořit pouze jeden párový socket. 4 SOUBOROVÝ SYSTÉM 17 Prvnı́ tři parametry volánı́ jsou zavedeny předevšı́m z důvodů symetrie s ostatnı́mi schránkovými službami a z důvodů možnosti budoucı́ho rozšı́řenı́. V současnosti však lze na mı́stě skutečných parametrů užı́t pouze tyto hodnoty: namespace=AF LOCAL, style=SOCK STREAM, protocol=0. poznámka : Destrukce párového socketu se děje za stejných podmı́nek jako destrukci roury. návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu 18 5. 5.1. Rukověť programátora v Unixu Procesy Spuštění a ukončení procesu pid t fork (void) POSIX,UNIX 47 unistd.h Tato Služba sloužı́cı́ v OS typu UNIX k vytvářenı́ nových procesů. Nově vzniklý proces sdı́lı́ se svým procesem-tvůrcem kódový segment a zı́skává kopii segmentu datového a zásobnı́kového. Jedná se tedy o prakticky identickou kopii rodičovského procesu. Jedinými rozdı́lem je návratová hodnota funkce fork a pid (process id - identifikačnı́ čı́slo procesu). Lze tak rozlišit návrat ze služby v rodičovském procesu od zdánlivého návratu z této služby v novém procesu (nový proces začne svou existenci právě tı́mto pseudo-návratem z forku) návratová hodnota : = 0 – v novém (synovském) procesu > 0 – v rodičovské procesu (nenulové pid synovského procesu) −1 – chyba při volánı́ fork (nový proces nevznikl, návrat je proveden -pouze do jednoho procesu) int execl (char * filename, char * arg0, char * arg1, . . . , NULL) int execv (char * filename, char ** argv) 49 48 int execle (char * filename, char * arg0, char * arg1, . . . , NULL, char ** envp) int execve (char * filename, char ** argv, char ** envp) int execlp (char * filename, char * arg0, char * arg1, . . . , NULL) int execvp (char * filename, char ** argv) POSIX,UNIX unistd.h Tato šestice knihovnı́ch funkcı́ je rozhranı́m pro jedinou službu operačnı́ho systému exec. Tato služba nahradı́ program aktuálnı́ho procesu nový programem. Proces si zachová své PID, prioritu, otevřené soubory a dalšı́ přidělené prostředky. Jeho datový a předevšı́m kódový region je však naplněn kódem a daty ze spustitelného souboru (tj. souborovým obrazem jistého programu) a je předáno řı́zenı́ (proveden skok) na vstupnı́ bod tohoto programu. Proces je tak nynı́ řı́zen novým programem a nenı́ již cesty zpět. Novému programu je možno možno předat jisté parametry (tj. řetězce odpovı́dajı́cı́ parametrům přı́kazového řádku shellu) a tzv. environment (prostředı́), který obsahuje soubor proměnných. Dle konvence je nutné jako prvnı́ parametr předat jméno programu (většinou pouze vlastnı́ jméno bez cesty)! Funkce typu execl. . . přijı́majı́ parametry ve formě jednotlivých řetězců, přičemž poslednı́m parametrem musı́ být NULL ukazatel (koncová zarážka). Funkce typu execv. . . očekávajı́ parametry ve formě pole ukazatelů na char, kde zarážkou je NULL ukazatel v poli. Funkce s koncovým e přijı́majı́ jako poslednı́ argument environment ve formě pole ukazatelů. Funkce s koncovým p využı́vajı́ pro hledánı́ spustitelného souboru standardnı́ shellovskou proceduru, tj. pokud jméno souboru neobsahuje cestu, jsou postupně zkoušeny adresáře ze shellové proměnné PATH. Funkce bez p hledajı́ takovýto soubor v aktuálnı́m pracovnı́m adresáři. návratová hodnota : Funkce se vracejı́ pouze v přı́padě neúspěchu, a to s hodnotou −1. 5 19 PROCESY void exit (int exstatus) ANSI C,POSIX,UNIX 50 stdlib.h Knihovnı́ funkce, která ukončuje proces volánı́m služby operačnı́ho systému. Funkce exit navı́c vyprázdnı́ všechny uživatelské I/O buffery datových proudů. Funkce je implicitně volána zavaděčem po návratu z funkce main. Bezprostřednı́ ukončenı́ lze dosáhnout volánı́m knihovnı́ funkce exit. exstatus – návratová hodnota procesu — tj. celé čı́slo v rozmezı́ 0 – 255, které signalizuje rodičovskému procesu důvod ukončenı́ (ten jej zı́ská volánı́m služby wait). Konvenčně označuje nulová hodnota normálnı́ ukončenı́, nenulová chybový stav. návratová hodnota : Funkce se nikdy nevracı́. konec 5.2. Pozastavení procesu pid t wait (int *status) 51 pid t waitpid (pid t pid, int *status, int options) POSIX,UNIX 52 posix,svid sys/wait.h Služby zajišt’ujı́cı́ čekánı́ rodičovského procesu na ukončenı́ procesu synovského. Proces je během čekánı́ zablokován. Služba navı́c vymaže synovský proces z tabulky procesů a převezme jeho rozšı́řený koncový stav (exit status). U služba wait nelze určit synovský proces na jehož konec se má čekat (tj. služba čeká na prvnı́ ukončený), ani nelze čekánı́ nikterak omezit. V mnoha přı́padech to postačuje (např. v přı́padě shellu čekajı́cı́ho na vykonánı́ přı́kazu), ale někdy je nutné použı́t rozšı́řenou verzi waitpid (předevšı́m při dynamické správě většı́ho počtu synovských procesů). status – výstupnı́ parametr obsahujı́cı́ rozšı́řený koncový stav synovského procesu. V přı́padě ukončenı́ synovského procesu volánı́m služby exit obsahuje hornı́ byte proměnné status návratovou hodnotu synovského procesu, dolnı́ byte hodnotu 0. V přı́padě ukončenı́ synovského procesu signálem obsahuje naopak hornı́ byte hodnotu 0 a dolnı́ čı́slo ukončovacı́ho signálu a jednobitovou informaci o vzniku core dump souboru (v nejvyššı́m bitu dolnı́ho bytu). Speciálnı́ hodnota je vrácena při zastavenı́ trasovaného souboru. Bližšı́ informace je možné nalézt např. v [Bach 1995]. pid – specifikace množiny synovských procesů na něž se čeká pid < −1 pid = −1 pid = 0 pid > 0 proces čeká pouze na synovské procesy s PGID rovným abs(pid) proces čeká na libovolný ze svých synovských procesů proces čeká pouze na procesy, jejichž PGID je rovno PID volajı́cı́ho procesu proces čeká pouze na synovský proces s daným pid options – přı́znaky modifikujı́cı́ chovánı́ služby waitpid. Nejdůležitějšı́ je volba NO WAIT, která zabránı́ zablokovánı́ služby v přı́padě, že neexistuje žádný pravě ukončený synovský proces (tj. mátoha [zombie]). V tomto přı́padě se služba ihned vrátı́ s návratovou hodnotou 0. Použı́vá se v přı́padě, kdy nechceme nebo nemůžeme na synovský proces čekat, ale potřebujeme ho (v přı́padě jeho ukončenı́) uvolnit z tabulky procesů, aby nezůstával mátohou. návratová hodnota : PID ukončeného synovského procesu nebo −1 v přı́padě, že žádný mátožný synovský proces neexistuje. poznámka : v systému kompatibilnı́ch s BSD je nutné mı́sto služby waitpid použı́t funkce wait3 a wait4 (jsou k dispozici i v Linuxu). Tyto funkce umožňujı́ navı́c zı́skat i některé dalšı́ informace o synovských procesech. 20 Rukověť programátora v Unixu int pause (void) POSIX,UNIX 53 unistd.h Zablokuje proces až do přı́chodu nejbližšı́ho signálu. Proces nespotřebovává žádné systémové prostředky (čas procesoru, operačnı́ pamět’) s výjimkou odkládacı́ho prostoru (swap). návratová hodnota : (po přerušenı́ signálem): vždy -1 unsigned int alarm (unsigned int sec) 54 POSIX,UNIX unistd.h Tato služba operačnı́ho systému umožňuje vytvářenı́ časovačů a plánovačů. Služba zajistı́, že volajı́cı́mu procesu bude po sec sekundách zaslán signál SIGALRM. Proces by měl ještě před volánı́m této služby nastavit obslužnou rutinu tohoto signálu (standardnı́ reakcı́ na tento signál je totiž ukončenı́ procesu). Každý proces může mı́t nastaven pouze jeden alarm. návratová hodnota : Funkce vracı́ počet sekund , který zbývá do zaslánı́ signálu od právě aktivnı́ho alarmu (tj. nastaveného předchozı́m volánı́m alarm). insigned int sleep (unsigned int sec) 55 POSIX,UNIX Služba zajišt’ujı́ci zablokovánı́ procesu na předem nastavenou dobu (v sekundách). Může být implementována např. takto sleep(n) = signal(SIGALRM,SIG IGN);alarm(n);pause(). V Linuxu je však implementována jinými prostředky a neblokuje tak použitı́ signálu SIGALRM. Novějšı́ unixovské systémy nabı́zejı́ i možnost použitı́ opakovacı́ho časovače s vyššı́m časovým rozlišenı́m (cca 1–10 ms) a to prostřednictvı́m služeb setitimer a getitimer. Dále je poskytována i služba int nanosleep (const struct timespec *req, struct timespec *rem) s podobným časovým rozlišenı́m. návratová hodnota : 0 v přı́padě, že interval čekánı́ proběhl celý, jinak (v přı́padě přerušenı́ signálem) počet zbývajı́cı́ch sekund. 5.3. Atributy procesu pid t getpid (void) 56 pid t getppid (void) 57 POSIX,UNIX unistd.h getpid – služba vracı́ čı́slo (tzv. pid [process identification]) jednoznačně identifikujı́cı́ volajı́cı́ proces. getppid – služba vracejı́cı́ čı́slo (tzv. ppid [parent process identification]) identifikujı́cı́ rodičovský proces volajı́cı́ho procesu. uid t getuid (void) 58 uid t geteuid (void) 59 POSIX unistd.h Služba getuid vracı́ vlastnı́ka procesu (přesněji jeho UID). Vlastnı́ka procesy postupně dědı́, přičemž primárnı́ určenı́ vlastnı́ka je zajištěno procesem login. Služba geteuid vracı́ tzv. efektivnı́ UID, tj. UID, které spolu s přı́stupovými právy souborů a jejich vlastnı́ky, rozhoduje zda je požadovaný přı́stup umožněn či odepřen. 5 21 PROCESY Efektivnı́ UID je u většiny procesů rovno UID vlastnı́ka procesu. Pouze u programů (spustitelných souborů), jež majı́ nastaven set-uid bit (s-bit), je po spuštěnı́ daného programu efektivnı́ UID rovno UID vlastnı́ka spustitelného souboru. int setuid (uid t uid) 60 POSIX unistd.h Služba pro nastavenı́ efektivnı́ho UID (nedejte se zmást názvem funkce). U procesů jejichž vlastnı́kem nenı́ super-uživatel (UID 6= 0) lze tuto funkcı́ dosáhnout pouze oboustranné výměny mezi UID a efektivnı́m UID (EUID). To jest u set-uid programů lze volánı́m setuid(UID) dosáhnout potlačenı́ propůjčeného EUID (např. z bezpečnostnı́ch důvodů před provedenı́m nebezpečné operace), a volánı́m setuid(staréEUID) se vrátit k původnı́mu propůjčenému EUID (je-li potřeba provést privilegovanou operaci). U super-uživatelských procesů je možné použı́t jako parametr libovolné platné UID, přičemž se změnı́ jak vlastnı́k procesu (process UID), tak i efektivnı́ vlatnı́k procesu (tak že platı́ novéUID = novéEUID = parametr služby). Tato změna je však ze zcela zřejmých důvodů nevratná. Pokud je potřeba změnit pouze EUID lze použı́t funkce seteuid. návratová hodnota : V přı́padě úspěchu 0, v přı́padě neúspěchu −1 gid t getgid (void) 61 gid t getegid (void) 62 POSIX unistd.h Služba getgid zjišt’uje reálného skupinového vlastnı́ka (tj. skupinu, jı́ž proces patřı́). Tento vlastnı́k je dán primárnı́ skupinou do nı́ž patřı́ v okamžiku spuštěnı́ procesu uživatel-vlastnı́k. Služba getegid vracı́ efektivnı́ GID (group id). Podobně jako u EUID určuje EGID práva procesu k souborům. U většiny procesů platı́, že EGID=GID, výjimkou jsou pouze procesy s nastavenı́m bitu set-gid, který zajišt’uje procesu propůjčenı́ práv skupinového vlastnı́ka spustitelného souboru (podobně viz EUID výše). Mechanismus propůjčovánı́ práv skupiny (set-gid) je v praxi použı́ván řı́dce. int setgid (gid t gid) 63 POSIX unistd.h Služba pro nastavenı́ efektivnı́ho group-ID. Funkce je obdobná službě setuid (až na to, že pracuje s identifikacı́ skupin). U nesuper-uživatelských procesů sloužı́ k přepı́nánı́ GID a EGID, u superuživatelských k nastavenı́ GID a EGID zároveň a na stejnou hodnotu (nevratně). I zde existuje specializovaná funkce setegid. pid t getpgrp (void) 64 POSIX,SVID unistd.h Služba pro zjištěnı́ skupiny procesů do nı́ž patřı́ aktuálnı́ proces (getpgrp). Protože koncepce skupin procesů se objevila v UNIXU až dosti pozdě, lišı́ se rozhranı́ těchto služeb v BSD a AT&T Unixu (resp. Posixu). BSD verze obsahuje navı́c parametr určujı́cı́ ID dotčeného procesu (tj. procesu u nějž je zjišt’ováno PGID). 22 Rukověť programátora v Unixu V obou verzı́ch je však skupina representována čı́slem PGID (process group id), které je rovno PID takzvaného vedoucı́ho procesu skupiny (viz setpgid). Pro procesy ve skupině lze provést jisté hromadné akce (např. zası́lánı́ signálů apod.). pid t setpgid (pid t pid, pid t pgid) 65 POSIX Služba nastavuje PGID procesu (tj. zařazuje proces do jisté skupiny procesů). Proces se tak stane vedoucı́m členem skupiny procesů. do které budou patřit i jeho potomci (pokud si sami nezaložı́ skupinu). Tı́mto způsoben je zajištěna i podpora správy úloh (jobů) v modernı́ch shellech. pid – Měnit lze pouze PGID u procesů se stejným EUID jako má volajı́cı́ proces. Toto omezenı́ však neplatı́ pro superuživatelské procesy. Je-li tento parametr nulový, měnı́ se PGID u volajı́cı́ho procesu. pgid – nová hodnota PGID. Nejčastěji se použı́vá speciálnı́ hodnota 0, která nastavı́ PGID=PID. návratová hodnota : Nová hodnota PGID v přı́padě úspěchu, jinak −1 poznámka : V BSD Unixu má funkce setpgid název setpgrp. 5.4. Signály int kill (pid t pid, int sig) POSIX,UNIX 66 signal.h Služba zası́lá procesu (resp. skupině procesů) signál s čı́slem sig. Signál lze zaslat pouze procesu se stejným efektivnı́m UID. Předchozı́ omezenı́ však neplatı́ pro procesy super-uživatele. pid – určuje procesy, jimž bude signál zaslán pid > 0 : signál je zaslán procesu s daným PID. pid = 0 : signál je zaslán všem procesům, jež patřı́ do stejné skupiny procesů jako odesı́latel. pid = −1 : nenı́-li odesı́latel superuživatel je, signál zaslán všem procesům, jejichž UID = EUID odesı́latele. U superuživatele je signál zaslán všem procesům kromě systémových. pid < −1 : signál je zaslán všem procesům jejichž ID skupiny procesů (PGID) se rovná abs(pid). signal – čı́slo (druh) odesı́laného signálu. Je-li signal roven 0, nedojde k odeslánı́ signálu, pouze se testuje, zda existuje alespoň jeden proces určený parametrem pid. název SIGALRM SIGCLD SIGINT SIGKILL SIGPIPE SIGQUIT SIGTERM SIGUSR1 SIGUSR2 popis konec časového intervalu (alarm) ukončení dětského procesu přerušení z klávesnice okamžité ukončení procesu zapisovanou rouru nikdo nečte ukončení s uložením obrazu paměti programové ukončení 1. uživatelem definovaný signál 2. uživatelem definovaný signál implicitní reakce ukončení ignorování ukončení bezpodmínečné ukončení ukončení ukončení s uložením paměti ukončení ukončení ukončení Tabulka 2: Nejčastěji používané signály návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu. poznámka : Pro zaslánı́ signálu volajı́cı́mu procesu (tj. zaslánı́ sobě sama) lze použı́t i knihovnı́ funkci raise = signal(getpid(),sig) 5 23 PROCESY Je-li potřeba zaslat signál cizı́ skupině procesů, je možno použı́t službu killpg void (* signal (int sig, void (*func)(int sig)))(int) 67 posix,unix signal.h Nastavenı́ rutiny pro ošetřenı́ signálu. Obslužnou rutinou signálu musı́ být funkce, přijı́majı́cı́ jeden parametr typu int. Tı́mto způsobem je rutině předáno čı́slo signálu, který ji vyvolal. Některé hardwarové signály předávajı́ funkci i dalšı́ rozšiřujı́cı́ parametry. Každý signál může mı́t svou obslužnou rutinu, může být ignorován (na mı́stě ukazatele na obslužnou rutinu se uvede konstanta (SIG IGN)) nebo zpracován standardnı́m způsobem, kterým je nejčastěji ukončenı́ procesu (konstanta SIG DFL). návratová hodnota : Funkce vracı́ staré (původnı́) nastavenı́ obslužné rutiny poznámka : služba pro nastavenı́ obslužné rutiny se volá nejen pro prvotnı́ nastavenı́ na začátku programu, ale často i v samotné obslužné rutině, protože System V nastavuje (obnovuje) při vstupu do rutiny standardnı́ zpracovánı́ (BSD GNU tak implicitně nečinı́, ale jistota je jistota). Chcete-li mı́t většı́ kontrolu nad obsluhou signálu a chcete-li se vyhnout nepřenositelným konstrukcı́m použijte raději funkci sigaction. int sigaction int signum,const struct sigaction * action, struct sigaction * old) 68 POSIX signal.h Služba odpovı́dajı́cı́ službě signal, jež však nabı́zı́ možnost přesněji specifikovat chovánı́ obslužných rutin signálů. Informace o obslužné rutině je předávána prostřednictvı́m struktury struct sigaction s těmito položkami: sa handler — ukazatel na obslužnou rutiny nebo speciálnı́ hodnoty SIG DFL a SIG IGN (odpovı́dá parametru func služby signal). sa mask — maska signálů automaticky blokovaných během prováděnı́ obslužné rutiny (viz následujı́cı́ služba sigprocmask). Aktuálně obsluhovaný signál je blokován implicitně. sa flags — přı́znaky modifikujı́cı́ obsluhu signálu. Mezi nejdůležitějšı́ patřı́ SA RESTART, jehož použitı́ zajistı́ restartovánı́ (obnovenı́) některých služeb po přı́chodu a obsluze signálu (jsou to většinou blokovatelné služby). Pokud nenı́ použit jsou tyto služby předčasně ukončeny s neúspěchem (errno má hodnotu EINTR) Obslužné rutiny zavedené pomocı́ sigaction nenastavujı́ na začátku rutiny obsluhu na SIG DFL. Služba nastavı́ obsluhu signálu signum dle struktury action a původnı́ nastavenı́ uložı́ do parametru old (nenı́-li nulový). návratová hodnota : 0 v přı́padě úspěchu, jinak -1 24 Rukověť programátora v Unixu int sigprocmask (int how, const sigset t *set, sigset t *oldset) 69 POSIX signal.h Funkce zajišt’ujı́cı́ pozdrženı́ (blokovánı́) jisté skupiny signálů. Pozdržený signál nevyvolává obslužnou rutinu, nenı́ ignorován ani nenı́ standardně ošetřen, ale je zapamatován. Po ukončenı́ pozdrženı́ jsou zapamatované signály zpracovány. Každý signál je navı́c implicitně blokován ve své obslužné rutině. how – vymezuje konkrétnı́ činnost (podslužbu). Jsou definovány následujı́cı́ podslužby (řı́dı́cı́ konstanty) SIG BLOCK – přidává k aktuálně blokovaným signálům signály, jež jsou specifikovány argumentem set. SIG UNBLOCK – signály specifikované v argumentu set jsou odstraněny z aktuálnı́ho nastavenı́ blokovaných (pozdržených) signálů. SIG SETMASK – nové nastavenı́ blokovaných signálů je dáno argumentem set. set – bitová maska určujı́cı́ pozdržené signály. Pro manipulaci s touto maskou sloužı́ následujı́cı́ pomocné funkce. int sigemptyset (sigset t *set) – vynuluje všechny bity masky int sigfillset (sigset t *set) – nastavuje (na hodnotu 1) všechny bity masky int sigaddset (sigset t *set, int signum) – nastavuje specifikovaný signál v bitové masce int sigdelset (sigset t *set, int signum) – nuluje specifikovaný signál z bitové masky int sigismember (const sigset t *set, int signum) – zjišt’uje zda je signál v bitové masce nastaven oldset – je-li tento argument různý od NULL, ukládá do něj služba starou (původnı́) masku blokovaných signálů poznámka : pozdržené signály lze detekovat pomocı́ služby sigpending. Odpovı́dajı́cı́ funkce má v BSD Unixu název sigblock a v Systemu V sighold (resp. sigrelse) int sigsuspend (const sigset t *mask) 70 POSIX signal.h Současně (atomicky) zajištuje odblokovánı́ pozdržených signálů a zablokovánı́ procesu. Tı́m se zabraňuje (souběhové) situaci, kdy signál přijde po jeho odblokovánı́, ale ještě před zablokovánı́m procesu (tj. mezi volánı́m služeb sigprocmask a pause). Tento signál by totiž mohl být pro dalšı́ zpracovánı́ ztracen. Odblokovánı́ je pouze dočasné (po dobu zpracovánı́ služby). poznámka : Odpovı́dajı́cı́ funkce má v BSD Unixu a v System V název sigpause (služby se však v obou větvı́ch lišı́). 6 25 UŽIVATELÉ A SKUPINY 6. 6.1. Uživatelé a skupiny Soubory passwd a group struct passwd * getpwnam (const char * name) struct passwd * getpwuid (uid t uid) 72 71 POSIX,SVID,BSD unistd.h Funkce poskytujı́cı́ informace o uživateli ze souboru etc/passwd. Uživatel je hledán na základě přihlašovacı́ho jména (getpwnam) nebo na základě jeho UID (getpwuid). návratová hodnota : Struktura s informacemi o uživateli (struct passwd), resp. NULL v přı́padě neúspěchu. struct passwd { char *pw_name; /* přihlašovací jméno */ char *pw_passwd; /* šifrované uživatelské heslo */ uid_t pw_uid; /* user id (uid)*/ gid_t pw_gid; /* group id (gid) primární skupiny*/ char *pw_gecos; /* skutečné jméno */ char *pw_dir; /* domácí adresář */ char *pw_shell; /* shell */ }; struct group * getgrnam (const char *name) struct group * getgrgid (gid t gid) 74 73 POSIX,SVID,BSD unistd.h Funkce poskytujı́cı́ informace o skupině ze souboru /etc/group. Skupina je hledána na základě jejı́ho jména (getgrnam) nebo na základě GID (getgrgid). návratová hodnota : Struktura s informacemi o skupině (struct group), resp. NULL v přı́padě neúspěchu. struct group { char *gr_name; /* jméno skupiny */ char *gr_passwd; /* heslo skupiny (není prakticky užíváno) */ gid_t gr_gid; /* group id (gid)*/ char **gr_mem; /* členové skupiny*/ }; 26 6.2. Rukověť programátora v Unixu Soubory utmp a wtmp struct utmp * getutent (void) 75 void setutent (void) 76 void endutent (void) 77 void utmpname (const char *file) void endutent (void) 79 78 GNU,SVID utmp.h Skupina funkcı́ sloužı́cı́ch pro přı́stup k systémovým databázı́m /var/run/utmp (informace o právě přihlášených uživatelı́ch – využı́vána např. programem who) a /var/run/wtmp, jež obsahuje historii takových událostı́ jako je přihlášenı́ a odhlášenı́ uživatelů, bootovánı́ systému a změna času (jejı́ obsah zobrazuje přı́kaz last). Běžné aplikace by měly tyto údaje pouze čı́st, za zápis jsou odpovědné aplikace typu login, telnetd, getty apod. (všechny tyto aplikace musı́ mı́t superuživatelská práva). Běžný postup při přı́stupu k databázi je následujı́cı́ : Nejdřı́ve je nutno zavolat funkci utmpname, jejı́ž jediný parametr určuje prohledávanou databázi (tj. utmp nebo wtmp). Posléze je volána funkce setutent, která inicializuje file-pointer na začátek souboru. Hlavnı́ blok programu pak může v cyklu procházet databázı́ opakovaným volánı́m funkce getutent. Tato funkce vracı́ v přı́padě úspěchu ukazatel na strukturu struct utmp obsahujı́cı́ jeden záznam databáze. Ukazatel ukazuje na statickou lokálnı́ proměnnou. #define #define #define #define #define #define #define #define #define UT_UNKNOWN RUN_LVL BOOT_TIME NEW_TIME OLD_TIME INIT_PROCESS LOGIN_PROCESS USER_PROCESS DEAD_PROCESS #define UT_LINESIZE #define UT_NAMESIZE #define UT_HOSTSIZE 0 1 2 3 4 5 6 7 8 /* /* /* /* /* /* /* /* změna run-levelu */ reboot */ změna času */ změna času */ spuštění procesu INIT */ pokus o přihlášení */ autentifikace uživatele */ odhlášení */ 12 8 16 struct utmp { //zkraceno short ut_type; /* typ události viz symbolicke konstanty*/ pid_t ut_pid; /* pid */ char ut_line[UT_LINESIZE]; /* tty */ char ut_id[2]; /* init id nebo zkracene tty */ struct timeval ut_time; /* čas (formát viz funkce "gettimeofday")*/ char ut_user[UT_NAMESIZE]; /* jméno uživatele */ char ut_host[UT_HOSTSIZE]; 6 UŽIVATELÉ A SKUPINY 27 /* jmeno vzdaleneho hostitele */ }; Ze struktury lze odvodit informace o zaznamenané události (většina událostı́ však vyplňuje pouze některé položky). V utmp jsou směrodatné pouze události typu LOGIN PROCESS, které majı́ vyplněny všechny položky. V wtmp se mohou nalézat události všech typů (jediným jistým údajem je kromě typu události čas). Varovánı́ : Některé přihlašovacı́ protokoly (jako je xmd) nevytvářejı́ záznam ani v wtmp ani v wtmp. Nepřı́jemným důsledkem je skutečnost, že nelze identifikovat ani spočı́st všechny přihlášené uživatele (je však otázka zda napřı́klad uživatele pracujı́cı́ na vzdáleném X-serveru, kteřı́ použı́vajı́ lokálnı́ počı́tač pouze k běhu svých X-klientů lze považovat za uživatele lokálnı́). Práce s databázı́ je většinou skončena po dosaženı́ konce souboru (getutent vracı́ NULL). Před úplným ukončenı́m je však nutno ještě zavolat funkci endutent. poznámka : Kromě výše uvedených funkcı́ lze pro práci s databázemi wtmp a utmp použı́t i funkcı́ getutid, getutline a pututline. Funkce pro přı́stup k souborům urmp a wtmp nejsou přizpůsobeny multithreadovému prostředı́. Tento problém řešı́ GNU zavedenı́m reentrantnı́ch verzı́ např. getutent r. 28 7. Rukověť programátora v Unixu Terminál int isatty (int desc) POSIX 80 unistd.h Funkce zjišt’uje zda je daný deskriptor otevřeného souboru desc spojen s terminálem. Tomu lze přizpůsobit chovánı́ programu (je např. možné interaktivnı́ dotazovánı́, jsou přı́stupné rozšiřujı́cı́ funkce). návratová hodnota : Nenulová hodnota v přı́padě že deskriptor je spojen s terminálem, jinak hodnota 0 char * ttyname (int desc) 81 POSIX unistd.h Funkce zjišt’ujı́cı́ jména terminálu, spojeného s deskriptorem. Jménem terminálu se rozumı́ úplné jméno speciálnı́ho souboru ovládajı́cı́ho daný terminál (např. /dev/tty1). Rozborem tohoto jména je možno zı́skat informace o typu a umı́stěnı́ terminálu (ty jsou bohužel u každé implementace jiné). Nenı́-li deskriptor spojen s terminálem, je vrácena hodnota NULL. 8 8. 29 ČAS Čas time t time (time t *tm) POSIX,UNIX 82 time.h Funkce zı́skává aktuálnı́ čas v unixovském formátu (tj. počet sekund od 1.ledna 1970 0:00:00 GMT). tm – je-li ukazatel různý od NULL, uložı́ funkce na odkazované mı́sto aktuálnı́ čas int gettimeofday (struct timeval *tv, struct timezone *tz) int settimeofday (struct timeval *tv, struct timezone *tz) 83 84 BSD sys/time.h Služba zjišt’uje (resp. nastavuje) aktuálnı́ čas ve formátu BSD (ten je přesnějšı́ než standardnı́ formát) a dále podává (resp. nastavuje) informaci o časovém pásmu, jenž je nastaven v systému. tv – struktura (předem alokovaná), která je naplněna informacı́ o aktuálnı́m čase (počtem sekund a milisekund od 1.ledna 1970 0:00:00) (struct timeval) struct timeval { long tv_sec; long tv_usec; }; /* sekundy */ /* milisekundy */ tz – struktura, která je naplněna informacı́ o nastaveném časovém pásmu. (struct timezone). Formát těchto informacı́ je následujı́cı́ : struct timezone { int tz_minuteswest; /* časový rozdíl v minutách (kladně na západ od Greenwiche) */ int tz_dsttime; /* typ letního času (malé přirozené číslo)*/ }; návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu int utime (const char *filename, struct utimbuf *buf) 85 POSIX,SVID time.h Nastavuje čas poslednı́ho přı́stupu a čas poslednı́ modifikace u souboru filename. buf – struktura v nı́ž jsou uloženy nastavované časové údaje ve tvaru (struct utimbuf), je-li ukazatel nulový je použit aktuálnı́ čas struct utimbuf { time_t actime; /* čas posledního přístupu */ time_t modtime; /* čas poslední modifikace */ }; 30 Rukověť programátora v Unixu clock t times (struct tms *buf) posix,unix 86 sys/types.h, sys/times.h, Zjišt’uje čas běhu procesu (v systémovém a uživatelském režimu), čas běhu jeho potomků a také čas běhu celého operačnı́ho systému. Všechny tyto časy jsou měřeny v ticı́ch časovače, což je jednotka času závislá na hardwaru (pro převod na sekundy je nutné použı́t konstantu HZ definované v sys/param.h. buf – ukazatel na strukturu typu struct tms, kterou funkce naplnı́ aktuálnı́mi hodnotami přı́slušných časů. struct tms { clock_t tms_utime; /* čas, jenž proces strávil v~uživatelském režimu (uživ. čas)*/ clock_t tms_stime; /* čas, jenž proces strávil v~režimu jádra (systémový čas)*/ clock_t tms_cutime; /* uživatelský čas synovských procesů */ clock_t tms_cstime /* systémový čas synovských procesů*/ }; návratová hodnota : Služba vracı́ počet tiků časovače od spuštěnı́ operačnı́ho systém. size t strftime (char *s, size t max, const char *format, const struct tm *tm) 87 ANSI C,POSIX time.h Funkce formátujı́cı́ časový údaj do lidmi čitelného řetězce. Výstup je proveden do řetězce s, přičemž je zapsáno maximálně max znaků. Časový údaj je vzat ze struktury tm, kterou lze zı́skat aplikovánı́m následujı́cı́ch dvou funkcı́ na hodnotu typu time t : struct tm * gmtime (const time t *timep) struct tm * localtime (const time t *timep) kde funkce gmtime vracı́ světový čas (Greenwich meridian time) a funkce localtime čas mı́stnı́. Struktura struct tm má následujı́cı́ tvar : struct tm { int int int int int int int int int }; tm_sec; tm_min; tm_hour; tm_mday; tm_mon; tm_year; tm_wday; tm_yday; tm_isdst; /* /* /* /* /* /* /* /* /* seconds */ minutes */ hours */ day of the month */ month */ year */ day of the week */ day in the year */ daylight saving time */ Formátovacı́ řetězec f ormat může stejně jako u funkce printf obsahovat jak běžné znaky tak formátovacı́ popisovače začı́najı́cı́ znakem %. Nejdůležitějšı́ popisovače jsou tyto : 9 31 FRONTY ZPRÁV (ČÁST IPC) %A %B %d %m %w %Y den v týdnu slovy měsíc slovy den v měsíci 00-31 měsíc číslem 01-12 den v týdnu číslem 0=neděle rok se stoletím %H %M %S %Z hodina 00-24 minuta 00-59 vteřina 00-59 časové pásmo (zkratka) Tabulka 3: popisovače funkce strftime 9. Fronty zpráv (část IPC) int msgget (key t key, int msgflag) 88 SVID sys/types.h, sys/ipc.h, sys/msg.h Služba pro vytvořenı́ fronty zpráv resp. pro vstup do již existujı́cı́ fronty. key – 32-bitové čı́slo jednoznačně identifikujı́cı́ danou frontu v celém počı́tačovém systému (tj. počı́tači). Procesy (i nepřı́buzné) tak mohou přistupovat k jedné frontě zpráv a použı́vat ji pro vzájemnou komunikaci. Klı́č (key) tedy odpovı́dá např. jménu souboru. Existujı́ tři strategie pro volby jedinečného klı́če pro novou frontu zpráv. Nejjednoduššı́ je prostý výběr náhodného čı́sla. Pokud je čı́slo opravdu náhodné, existuje pouze malá pravděpodobnost, že bude zvoleno stejné čı́slo pro dvě různé fronty (max-počet-front 232 ). Dále je možné použı́t funkce ftok pro odvozenı́ klı́če ze jména existujı́cı́ho souboru a malého celého čı́sla (projektu). Ani v tomto přı́padě nenı́ zaručena jednoznačnost, ale pravděpodobnost konfliktu je velmi malá. Poslednı́ možnostı́ je uvedenı́ předdefinované konstanty IPC PRIVATE na mı́stě klı́če. Touto volbou je na jedné straně zajištěno vytvořenı́ jedinečné fronty, na druhé straně neexistuje skutečný klı́č a tak k frontě mohou přistupovat pouze potomci procesu-tvůrce fronty (mohou totiž zdědit tzv. msqid (viz návratová hodnota)) resp. procesy, jež si msqid vyměnı́ přes jiný komunikačnı́ kanál. msgflag – Přı́stupová práva k frontě kombinovaná (|) s módy připojenı́. Módy připojenı́ jsou určeny kombinacı́ dvou konstant IPC CREAT a IPC EXCL. Mód IPC CREAT | IPC EXCL sloužı́ k vytvořenı́ nové fronty zpráv. V přı́padě, že fronta specifikovaná klı́čem existuje, skončı́ služba neúspěchem. Mód IPC CREAT také umožňuje vytvořenı́ fronty (jestliže fronta ještě neexistuje), ale navı́c zajistı́ připojenı́ k již existujı́cı́ frontě. Mód bez uvedenı́ výše jmenovaných konstant (flagů) sloužı́ k připojenı́ (přistoupenı́) k již existujı́cı́ frontě zpráv. Pokud fronta neexistuje, skončı́ v tomto přı́padě služba neúspěchem. Přı́stupová práva majı́ standardnı́ (oktalový) unixovský formát (použita jsou se však pouze práva R a W). Je-li službou vytvořena nová fronta, stanou se specifikovaná práva skutečnými právy fronty. V přı́padě pouhého připojenı́ je požadován souhlas požadovaných práv s právy procesu k frontě. Jeli požadováno neposkytované právo, připojenı́ se neprovede. Jedná se však pouze o předběžnou (a nepovinnou) kontrolu práv. Skutečná kontrola se provádı́ při každém přı́stupu k frontě (při odesı́lánı́ a přijı́mánı́ zpráv). návratová hodnota : V přı́padě úspěchu jednoznačný (a celosystémově platný) deskriptor (handler) fronty označovaný jako msquid, v přı́padě neúspěchu −1 32 Rukověť programátora v Unixu int msgsnd (int msqid, struct msgbuf * ptr, int length, int flag) SVID 89 sys/types.h, sys/ipc.h, sys/msg.h Služba pro zaslánı́ zprávy prostřednictvı́m fronty zpráv. msqid – deskriptor (handler) existujı́cı́ fronty zpráv ptr – ukazatel na data odesı́lané zprávy. Zpráva musı́ mı́t následujı́cı́ (volný) formát : struct msgbuf { long mtype; char mtext [N]; }; Zpráva začı́ná 32-bitovou hlavičkou (typem) a dále pokračuje vlatnı́mi daty. Data mohou mı́t rozsah od 0 bytů do několika málo kilobytů a mohou být jak textová tak binárnı́. Pro popis zprávy je povětšinou nutné deklarovat vlastnı́ strukturu, jež má pevně stanovenou maximálnı́ délku zprávy a ukazatel na ni při použitı́ přetypovat na typ (struct msgbuf *). length – skutečná délka dat zprávy (tj. bez hlavičky type), může být rovna i 0 flag – přı́znaky modifikujı́cı́ chovánı́ službymsgsnd. Kromě nulové hodnoty (standardnı́ chovánı́), je podporován i přı́znak IPC NOWAIT. Při použitı́ tohoto přı́znaku, se proces nezablokovává z důvodů přeplněnı́ fronty (tj. při překročenı́ maximálnı́ho počtu zpráv ve frontě či v celém systému), ale ihned se vracı́ s neúspěchem. návratová hodnota : 0 v přı́padě úspěchu, −1 v přı́padě neúspěchu (např. neexistence fronty, plná fronta při IPC NOWAIT). int msgrcv (int msqid, struct msgbuf *ptr, int length, long msgtype, int flag) 90 SVID sys/types.h, sys/ipc.h, sys/msg.h Služba pro čtenı́ zprávy z fronty zpráv. msqid – deskriptor (handler) existujı́cı́ fronty zpráv ptr – ukazatel do paměti určené na uloženı́ zprávy (včetně hlavičky) length – velikost paměti určené pro uloženı́ dat zprávy (bez hlavičky) msgtype – parametr určujı́cı́ jaká zpráva bude z fronty přečtena msgtype=0 – přečtena je prvnı́ zpráva ve frontě (vhodné pro všesměrové zprávy) msgtype>0 – přečtena je prvnı́ zpráva z hlavičkou rovnou hodnotě msgtype (vhodné pro směrované zprávy, kde např. msgtype=PID). msgtype<0 – přečtena je zpráva s nejnižšı́ hodnotou v hlavičce, která je zároveň menšı́ než abs(msgtype). (vhodné pro podporu prioritnı́ch zpráv) flag – Služba podporuje dva přı́znaky. Přı́znak IPC NOWAIT zabraňuje zablokovánı́ procesu, nenı́-li žádná zpráva k dispozici (služba se vrátı́ s chybou). Přı́znak MSG NOERROR naopak zabraňuje chybě, pokud je zpráva delšı́ než rezervované pamět’ové mı́sto. Služba v tomto přı́padě zprávu bez upozorněnı́ zkrátı́. návratová hodnota : Délka obdržené zprávy v bytech (bez hlavičky) v přı́padě úspěchu, nebo −1 při neúspěchu. 9 33 FRONTY ZPRÁV (ČÁST IPC) int msgctl (int msqid, int cmd, struct msqid ds *buff) 91 SVID sys/types.h, sys/ipc.h, sys/msg.h Služba pro správu a kontrolu fronty zpráv. Konkrétnı́ činnost (podslužba) je určena parametrem cmd. Parametr buff obsahuje přı́padné vlastnı́ parametry této podslužby. zrušenı́ fronty zpráv : cmd = IPC RMID, buff = NULL (bezparametrická podslužba) 34 10. Rukověť programátora v Unixu Rozmanitosti int uname (struct utsname *buf) POSIX,BSD 92 sys/utsname.h Služba poskytujı́cı́ základnı́ informace o výpočetnı́m systému, na němž proces běžı́. Informace jsou uloženy do struktury struct ustname. struct utsname { char sysname[SYS_NMLN]; /*klon operačního systému (např.Linux)*/ char nodename[SYS_NMLN]; char release[SYS_NMLN]; /*hlavní verze*/ char version[SYS_NMLN]; /*podverze*/ char machine[SYS_NMLN] /*typ počítače - platforma např. 586*/ }; návratová hodnota : 0 v přı́padě úspěchu, jinak −1 int sysinfo (struct sysinfo *info) LINUX 93 sys/sysinfo.h Funkce vracı́ informace o aktuálnı́m stavu systému v následujı́cı́ struktuře struct sysinfo. struct sysinfo { long uptime; unsigned long loads[3]; unsigned long totalram; unsigned long freeram; unsigned long sharedram; unsigned long bufferram; unsigned long totalswap; unsigned long freeswap; unsigned short procs; char _f[22]; }; /* /* /* /* /* /* /* /* /* /* sekundy od bootu */ 1, 5, a 15 minutové load averages */ celková velikost operační paměti*/ velikost volné operační paměti */ objem sdílené paměti */ paměť určená pro buffery */ celková velikost odklád. prostoru*/ velikost volného odklád. prostoru*/ počet právě aktivních procesů*/ výplněk do 64 bytů*/ poznámka : Funkce nenı́ přenositelná, a lze jı́ použı́t pouze v Linuxu. void sync (void) 94 X/Open 10 35 ROZMANITOSTI int fsync (int fd) POSIX,BSD,SVID 95 unistd.h Uloženı́ vyrovnávacı́ch pamětı́ na disk. U služby sync jsou uloženy všechny u fsync pouze ty, které náležejı́ danému souboru (identifikovanému deskriptorem otevřeného souboru) Nejdřı́ve jsou ukládány sytémové oblasti (např. tabulka i-uzlů) potom datové bloky. návratová hodnota : Funkce vracı́ vždy hodnotu 0 (tj. jest vždy úspěšně skončı́). void perror (const char *s) 96 ANSI C,POSIX stdio.h Vypsánı́ chybového hlášenı́ na standardnı́ chybový výstup, jež popisuje poslednı́ chybu vzniklou volánı́m standardnı́ knihovnı́ funkce nebo služby operačnı́ho systému. Nejdřı́ve je vypsán obsah parametru s poté dvojtečka a krátký popis chyby. Popis chyby je převzat z externı́ho pole řetězců const char *sys errlist[], za použitı́ externı́ proměnné errno jako indexu. Proměnná errno je nastavena knihovnı́ funkcı́ nebo službou a je platná pouze bezprostředně za volánı́m funkce nebo služby (tj. může být měněna každou knihovnı́ funkcı́ i při jejı́m úspěšném ukončenı́). poznámka : Ne každá chybová hodnota v proměnné errno musı́ mı́t záznam v sys errlist a může dokonce přesáhnou rozsah tohoto pole (velikost pole je dána proměnou sys nerr). Nejjednoduššı́ a nejpřenositelnějšı́ (nelze-li použitı́ perror) je použitı́ funkce char * strerror (int errnum) (string.h). Proměnná errno a ostatnı́ pomocné proměnné jsou deklarovány v hlavičkovém souboru errno.h 36 11. Rukověť programátora v Unixu Rozšířený výstup na terminál (knihovna curses) Všechny funkce uvedené v této kapitole jsou kompatibilnı́ s normou SVID. V Linuxu je nutno vložit hlavičkový soubor ncurses.h a zajistit přilinkovánı́ knihovny libncurses.a2 (tato knihovna je zpětně kompatibilnı́ s knihovnou curses). Funkce knihovny curses mohou být modifikovány prefixy. Nejdůležitějšı́m prefixem je znak w, který signalizuje, že funkce se týká konkrétnı́ho okna určeného explicitně prvnı́m z parametrů funkce. Chybı́-li tento parametr je použito implicitně celoobrazovkové okno stdscr. Dalšı́m prefixem je prefix mv (viz funkce wmove) a existujı́ i dalšı́. Prefixy lze i kombinovat. V následujı́cı́m přehledu je z rodiny různě prefixovaných funkcı́ uveden pouze jeden representant a ostatnı́ funkce jsou krátce shrnuty pod jeho úplnou deklaracı́ (mı́sto hlavičkových souborů). 11.1. Inicializace a ukončení WINDOW * initscr (void) 97 Inicializuje rozšı́řené ovládánı́ terminálu (resp. konzole). Vytvářı́ dvě standardnı́ celoobrazovková okna (stdscr, curscr). int endwin (void) 98 Ukončuje rozšı́řený přı́stup k terminálu a vracı́ nastavenı́ terminálu do stavu před volánı́m funkce initscr. Tuto funkci je nutné volat vždy po ukončenı́ rozšı́řeného výstupu, v opačném přı́padě může být narušen standardnı́ vstup a výstup (např. v shellu). int cbreak (void) 99 int nocbreak (void) 100 int echo (void) 101 int noecho (void) 102 int keypad (WINDOW *win, bool bf) 103 Skupina funkcı́ pro nastavenı́ vlastnostı́ terminálu. Po volánı́ funkce cbreak je vstup z terminálu zpracováván po znacı́ch, zatı́mco standardně (nebo po volánı́ funkce nocbreak) je zpracováván po celých řádcı́ch (tj. funkce pro čtenı́ znaku se vrátı́ ze čtenı́ až po zadánı́ znaku nového řádku). Standardně je v OS Unix prováděno bezprostřednı́ zobrazovánı́ vstupnı́ho znaku (echo). Tomuto chovánı́ (v prostředı́ rozšı́řeného přı́stupu k terminálu většinou nežádoucı́mu) je možno zabránit volánı́m funkce noecho. Volánı́m funkce echo se obnovı́ standardnı́ chovánı́. Pomocı́ funkce keypad lze povolit čtenı́ speciálnı́ch a funkčnı́ch kláves. Jako parametr win se uvede okno (nastavenı́ je lokálnı́) a na mı́stě parametru bf se uvede konstanta TRUE. Pomocı́ hodnoty konstanty FALSE naopak čtenı́ speciálnı́ch kláves zakážeme. int start color (void) 104 Aktivace podpory barevného výstupu a inicializace přı́slušných základnı́ch struktur a symbolických konstant. Volánı́ funce má smysl pouze u terminálů s podporou barevného výstupu. Zda aktuálnı́ terminál poskytuje přı́slušnou podporu lze zjistit volánı́m služby has colors. 2 parametrem -lncurses překladače gcc 11 37 ROZŠÍŘENÝ VÝSTUP NA TERMINÁL (KNIHOVNA CURSES) 11.2. Okna WINDOW * newwin (int lines, int columns, int begin y, int begin x) 105 Vytvářı́ nové okno na absolutnı́ pozici begin y (řádek), begin x (sloupec). Okno má lines řádků a columns sloupců. Pro okno je vytvořena pamět’ová representace, ale nenı́ zobrazeno na terminálu (je nutné použı́t wrefresh). int wrefresh (WINDOW * win) 106 refresh Aktualizuje obsah fyzického okna dle změn v jeho pamět’ové representaci (pamět’ové kopii). Obnovovány jsou pouze znaky změněné funkcemi pro výstup do daného okna. Je-li nutné obnovit celé okno (např. v přı́padě jeho překrytı́ jiným oknem) je nutné použı́t před volánı́m funkce wrefresh funkci touchwin. Funkce wref resh se volá velmi často, protože všechny funkce pro zápis do okna měnı́ pouze pamět’ovou representaci a ne skutečné okno na terminálu. int wborder (WINDOW * win,ls,rs,ts,bs,tl,tr,bl,br) 107 border Vytvořı́ kolem okna okraj ze specifikovaných znaků. Okraj je však vytvářen uvnitř plochy okna. Povětšinou stačı́ použı́t implicitnı́ nastavenı́, které se použije v přı́padě, že všechny parametry vyjma win majı́ hodnotu 0. Prvnı́ čtyři parametry složı́ ke zvolenı́ znaků pro strany, druhé čtyři pro rohy okna (l=left,r=right, b=bottom, t=top, s=side). int wmove (WINDOW * win, int line, int column) 108 move Posune kursor (ukazatel aktuálnı́ pozice) na řádek line a sloupec column. Následujı́cı́ zápis do okna bude začı́nat na této pozici. Počátek souřadnic (0,0) je v levém hornı́m rohu okna. V přı́padě, že následujı́cı́ funkce provádı́ zápis do okna, lze obě volánı́ spojit do nového. Spojené volánı́ obsahuje prefix mv a pozice je předána v prvnı́ch dvou parametrech po přı́padném parametru win. chtype winch (WINDOW *win) 109 inch, mvwinch, mvinch Čte znak z aktuálnı́ pozice (pozice kursoru) okna win. int werase (WINDOW * win) 110 erase Maže obsah okna win, a to přepsánı́m jeho obsahu znakem mezera. Změna se týká pouze pamět’ové representace okna, pro zobrazenı́ smazaného okna je nutné použı́t funkce wrefresh. 38 11.3. Rukověť programátora v Unixu Atributy int wattrset (WINDOW *win, int attr) int wattron (WINDOW * win, int attr) int wattroff (WINDOW * win, int attr) 111 112 113 attron,attrset,attroff Funkce wattrset nastavuje nové atributy textu. Tyto atributy se použijı́ při následujı́cı́ch zápisech textu do okna. Funkce wattron umožňuje přidat k aktuálnı́m atributům atributy nové a funkce wattroff sloužı́ naopak k selektivnı́mu odebı́ránı́ atributů. Atributy lze spojovat pomocı́ operátoru or (|) attr – atributy textu (typ, barva apod.). Tyto atributy jsou obecné a záležı́ pouze na terminálu, jak je zobrazı́ (a toto zobrazenı́ lze povětšinou v jistém rozsahu ovlivňovat). Textové terminály rozlišujı́ jednotlivé typy textů barvou pozadı́ a barvou samotného textu, grafické terminály zobrazujı́ atributy většinou přesně. A STANDOUT A REVERSE A BOLD A UNDERLINE A BLINK COLOR PAIR(n) – standardnı́ text – reversnı́ text – tučný (jasnějšı́) text – podtržený (zvýrazněný) text – blikajı́cı́ text (grafické terminály tento atribut často neuplatňujı́) – barevný text, jehož barva je určena barevným párem (pozadı́-popředı́) s čı́slem n. Barevný pár musı́ být nastaven funkcı́ init pair (dalšı́ informace viz tam). int init pair (short pair,short f, short b) 114 Funkce vytvářejı́cı́ barevný pár (barva popředı́ – barva pozadı́) s čı́slem n, přičemž čı́slo musı́ být v rozsahu 1 . . . COLOR PAIRS (konstanta definovaná funkcı́ start color. Dalšı́ dva parametry určujı́ barvu popředı́ (f [foreground] a pozadı́ (b [background]). Lze volit mezi devı́ti základnı́mi barvami, jimž přı́slušı́cı́ symbolické konstanty jsou definovány takto: COLOR BLACK, COLOR RED, COLOR GREEN, COLOR YELLOW, COLOR BLUE, COLOR MAGENTA, COLOR CYAN, COLOR WHITE. poznámka : Před volánı́m funkce init pair je nutno inicializovat podporu barevného výstupu volánı́m služby start color. 11.4. Vstup a výstup int waddch (WINDOW *win, chtype char) 115 adch,mvaddch, mvwadch Funkce waddch zapı́še znak char do okna win na aktuálnı́ pozici kursoru. Funkce mvwadch umožňuje ještě před zápisem změnit pozici kursoru na řádek line a sloupce column. (mvwadch = move + addch). int waddstr (WINDOW * win, char * string) 116 addstr, mvwaddstr, mvaddstr Vypisuje na pozici kursoru v okně win řetězec string. Pokud se řetězec nevejde na řádek je automaticky zalomen. 11 ROZŠÍŘENÝ VÝSTUP NA TERMINÁL (KNIHOVNA CURSES) int wprintw (WINDOW * win, char * format, . . . ) 39 117 printw, mvwprintw, mvprintw Vypisuje formátovaný výstup do okna win na pozici kursoru. Formátovacı́ řetězec a volitelné parametry jsou stejné jako u knihovnı́ funkce printf. int wgetch (WINDOW *win) 118 getch, mvwgetch, mvgetch Čte znak z klávesnice terminálu, jenž je spojen se specifikovaným oknem (u standardnı́ho okna stdscr jı́m je řı́dı́cı́ terminál procesu). Nenı́-li znak k dispozici je volánı́ zablokováno až do jeho výskytu. návratová hodnota : Funkce vracı́ ASCII hodnotu nebo rozšı́řený kód klávesy (pouze neznakových kláves, je-li povoleno čtenı́ neznakových kláves funkcı́ keypad, jinak jsou tyto klávesy ignorovány). klávesa (PC klávesnice) šipka vlevo (←) šipka vpravo (→) šipka nahoru (↑) šipka dolů (↓) Home End PageUp PageDown Insert Delete F1 – F10 F11 = Shift F1 F12 = Shift F12 symbolická konstanta (ncurses.h) KEY LEFT KEY RIGHT KEY UP KEY DOWN KEY HOME KEY END KEY PPAGE KEY NPAGE KEY IC KEY DC F(1) – F(10) F(11) F(12) Tabulka 4: speciální klávesy int wgetstr (WINDOW *win, char * str) 119 getstr, mvwgetstr, mvgetstr int wscanw (WINDOW * win, char * format, . . . ) 120 scanw, mvwscanw, mvscanw Čte řádek (wgetstr) nebo formátované hodnoty (wscanw) z klávesnice terminálu spojeného s oknem win. Chovánı́ a parametry funkce wscanw jsou stejné jako u knihovnı́ funkci scanf. 40 Rukověť programátora v Unixu Obsah 1. Úvod 1.1. Nezařazené skupiny funkcı́ . . 1.2. Přenositelnost . . . . . . . . . 1.3. Požadované předběžné znalosti 1.4. Struktura hesla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Parametry příkazového řádku a prostředí 2 2 2 2 3 4 3. Soubory 3.1. Otevřenı́ a vytvořenı́ souboru . . . . . 3.2. Přı́stup k souboru (čtenı́, zápis) . . . . 3.3. Deskriptory otevřených souborů . . . 3.4. Paralelnı́ (asynchronnı́) přı́stup . . . . 3.5. Mapovánı́ souborů do virtuálnı́ paměti 3.6. Uzamykánı́ souborů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7 8 8 9 10 4. Souborový systém 4.1. Informace o souboru . 4.2. Adresářové služby . . 4.3. Manipulace se soubory 4.4. Vlastnictvı́ a práva . . 4.5. Čtenı́ obsahu adresáře . 4.6. Roury . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 13 14 14 15 16 . . . . 18 18 19 20 22 . . . . . . . . . . . . . . . . . . 5. Procesy 5.1. Spuštěnı́ a ukončenı́ procesu 5.2. Pozastavenı́ procesu . . . . . 5.3. Atributy procesu . . . . . . 5.4. Signály . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6. Uživatelé a skupiny 25 6.1. Soubory passwd a group . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 6.2. Soubory utmp a wtmp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 7. Terminál 28 8. Čas 29 9. Fronty zpráv (část IPC) 31 10.Rozmanitosti 34 11.Rozšířený výstup na terminál 11.1. Inicializace a ukončenı́ . . 11.2. Okna . . . . . . . . . . . . 11.3. Atributy . . . . . . . . . . 11.4. Vstup a výstup . . . . . . (knihovna curses) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 36 37 38 38 41 Index Index exit, 19 A access, 7 alarm, 20 C cbreak, 36 chdir, 13 chmod, 14 chown, 15 close, 6 closedir, 16 creat, 6 D dup, 8 dup2, 8 E echo, 36 endutent, 26 endwin, 36 errno, 35 execl, 18 execle, 18 execlp, 18 execv, 18 execve, 18 execvp, 18 exit, 18 F fchmod, 14 fchown, 15 fcntl, 10 FD CLR, 9 FD ISSET, 9 FD SET, 9 FD ZERO, 9 fdopen, 8 fileno, 8 fork, 18 fstat, 12 fsync, 34 ftok, 31 ftruncate, 8 G getcwd, 13 getegid, 21 getenv, 5 geteuid, 20 getgid, 21 getgrgid, 25 getgrnam, 25 getitimer, 20 getopt, 4 getopt long, 4 getpgrp, 21 getpid, 20 getppid, 20 getpwnam, 25 getpwuid, 25 gettimeofday, 29 getuid, 20 getumask, 7 getutent, 26 getutent r, 27 getutid, 27 getutline, 27 gmtime, 30 H h, 36 I init pair, 38 initscr, 36 isatty, 28 K keypad, 36 kill, 22 killpg, 22 L link, 14 localtime, 30 lseek, 7 42 lstat, 12 M mkdir, 13 mkfifo, 16 mmap, 9 mremap, 10 msgctl, 32 msgget, 31 msgrcv, 32 msgsnd, 31 munmap, 10 N nanosleep, 20 newwin, 37 nocbreak, 36 noecho, 36 O open, 6 opendir, 15 P pause, 19 perror, 35 pipe, 16 putenv, 5 pututline, 27 R raise, 22 read, 7 readdir, 15 readdir r, 15 readlink, 13 remove, 14 rename, 14 rewinddir, 15 rmdir, 13 S S S S S S S ISBLK, 12 ISCHR, 12 ISDIR, 12 ISFIFO, 12 ISLNK, 12 ISREG, 12 Rukověť programátora v Unixu S ISSOCK, 12 select, 8 setegid, 21 setenv, 5 seteuid, 21 setgid, 21 setitimer, 20 setpgid, 21 settimeofday, 29 setuid, 21 setutent, 26 sigaction, 23 sigaddset, 24 sigblock, 24 sigdelset, 24 sigemptyset, 24 sigfillset, 24 sighold, 24 sigismember, 24 signal, 22 sigpause, 24 sigpending, 24 sigprocmask, 23 sigrelse, 24 sigsuspend, 24 sleep, 20 socketpair, 16 start color, 36 stat, 12 strerror, 35 strftime, 30 struct dirent, 15 struct flock, 10 struct group, 25 struct option, 4 struct passwd, 25 struct sigaction, 23 struct stat, 12 struct sysinfo, 34 struct timeval, 29 struct timezone, 29 struct tm, 30 struct tms, 30 struct ustname, 34 struct utimbuf, 29 struct utmp, 26 symlink, 14 sync, 34 sys errlist, 35 Index sys nerr, 35 sysinfo, 34 T time, 29 times, 30 ttyname, 28 U umask, 6 uname, 34 unlink, 14 utime, 29 utmpname, 26 W waddch, 38 waddstr, 38 wait, 19 wait3, 19 wait4, 19 waitpid, 19 wattroff, 38 wattron, 38 wattrset, 38 wborder, 37 werase, 37 wgetch, 39 wgetstr, 39 winch, 37 wmove, 37 wprintw, 38 wrefresh, 37 write, 7 wscanw, 39 43
Podobné dokumenty
Studijní osnova pro předmět: Programování v operačních
namapuje soubor na adresu dle své potřeby. Parametr length udává počet bajtů, které se ze souboru do paměti namapují. Pro parametr prot se
dle způsobu otevření souboru volí kombinace PROT_READ a PR...
CPU RAM I/O BUS
• množiny IP adres se přidělujı́ podle fyzické polohy LAN, např. 147.32.5.* je Břehová, 147.32.8.* je Trojanova
• routery v uzlech sı́tě třı́dı́ pakety podle IP adresy adresáta, routery m...
PRINCIPy A PROBLéMy OPERAčNíHO
vybavení neboli operační systém (Operating System). Zdrojem výpočetního systému je některá
jeho část, kterou úloha potřebuje pro plnění své funkce. Je jím např. tiskárna, a to jak fyzická
periferie...
Programování v jazyku C-C++
V příkladu jsou v programu dvě funkce. Funkce main() a funkce printf(). Funkci main() definujeme. To
znamená, že popisujeme co tato funkce bude dělat. Funkci printf() pouze „voláme“. Je to funkce
d...
Knihovny funkcí Chyby v CRT
vrací kladnou nenulovou hodnotu v případě dosažení konce souboru stream, jinak 0.
int ferror(FILE *stream);
Operaˇcní systémy
• Běží obvykle v privilegovaném režimu.
– V tomto režimu lze obvykle provádět libovolné operace nad HW počítače.
– Za účelem oddělení a ochrany uživatelů a jejich aplikačních programů nesm...
Obsah - CPress
Funkce pro práci s jednoduchými hodnotami
Sčítání (+), odčítání (-), násobení (*) a dělení (/)
NULL
NVL – náhrada hodnoty NULL
Funkce ABS – absolutní hodnota
Funkce CEIL
Funkce FLOOR
Funkce MOD
Fun...
Distribuované objektové systémy --
které bude sdı́leno. Dále je vygenerována kostra programu, jež zajistı́ správné volanı́
procedur a použitı́ kódu XDR. Značnou nevýhodou RPC je možnost předávánı́ pouze
jednoho paramet...