rukovet programatora v os unix

Transkript

rukovet programatora v os unix
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

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...

Více

CPU RAM I/O BUS

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...

Více

PRINCIPy A PROBLéMy OPERAčNíHO

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...

Více

2na1

2na1 #include , , , , open – otevření souboru

Více

Programování v jazyku C-C++

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...

Více

Knihovny funkcí Chyby v CRT

Knihovny funkcí Chyby v CRT vrací kladnou nenulovou hodnotu v případě dosažení konce souboru stream, jinak 0. int ferror(FILE *stream);

Více

Operaˇcní systémy

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...

Více

Obsah - CPress

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...

Více

Distribuované objektové systémy --

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...

Více