28
Sistemsko programiranje pod UNIX-om 1

Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Sistemsko programiranjepod UNIX-om

1

Page 2: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Uvod

Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu i polaganje pismenog dela ispita iz Programskih sistema. On sadrzi osnovne informacije o upotrebi raznih funkcija i sistemskih poziva za programiranje pod UNIX-om. Obradjene su sledece oblasti: Ulaz i izlaz fajlova, Fajlovi i direktorijumi, Standardna ulazno izlazna biblioteka, Sistemske informacije, Okruzenje UNIX procesa, Kontrola procesa, Odnosi izmedju procesa, Signali. Pri tom je kompletan tekst radjen po knizi Advanced Programming in the UNIX Environment (u daljem tekstu APUE) ciji je autor Richard Stevens. Dakle, svi prototipovi funkcija, njihove povratne vrednosti i nacin rada prepisani su iz ove knjige, pa se autor ovog materijala ogradjuje unapred u slucaju netacnih informacija. Takodje, ovaj materijal nije namenjen za ucenje, pa je strogo preporucljivo procitati APUE pre citanja ovog materijala. Osnovna zamisao ovog teksta je da se prilikom programiranja lakse pronadje neka funkcija i vidi kako se ona koristi (lakse je prelistati tridesetak stranica nego prevrtati kopiju APUE-a od 750 strana). Mnoge bitne i sustinske stvari koje se ticu UNIX sistema su u ovom tekstu izostavljene. Pojedine funkcije koje su se autoru ucinile slozenije, i nepotrebne iz ugla svakodnevnog programiranja su preskocene. Neke stvari koje sam autor nije razumeo, preskocio je (autor ovog teksta u trenutku pisanja nije jos polozio sisteme ). Dakle, ovaj materijal sadrzi samo one podatke koji su u trenutku programiranja (npr. na ispitu) potrebne, a koje je smesno pamtiti. Medjutim, razumevanje nekih desavanja pod UNIX sistemom neophodno je za programiranje, i to se mora procitati iz APUE-a.

Osim pomenutog APUE-a, obavezna literatura za ovaj ispit je knjiga C Programming Language ciji su autori Dennis Ritchie i Brian Kernighan. U njima se moze naci detaljan pregled standardne C biblioteke, kompletnog C jezika, kao i neke varijante implementacije pojedinih standardnih C funkcija pod UNIX sistemom. Sve ovo je preporucljivo procitati.

Autor je u tekstu koristio skracenice, slengove i konstrukcije po ugledu na APUE. Ako naidjete npr. na PPID (parent-process-ID), PGID (process-group-ID) saved-set-user-ID, effective-user-ID, sticky-bit i slicno, potrazite u APUE-u odgovarajuci pojam, jer u ovom materijalu necete naci objasnjenje. Razlog za to je jednostavan: to su dosta slozeni pojmovi, a pisanje objasnjenja bi bilo dugo, prevazislo bi prvobitnu namenu ovog teksta, i svelo bi se na prevodjenje APUE-a, sto autoru ni u kom slucaju nije bila namera .

Vazno je napomenuti da pre svega gore navedenog treba procitati folije asistenta mr Aca Samardzica za UNIX, kao i za GNU programerske alate. U ovom trenutku je na njegovom sajtu okacena nova verzija UNIX folija, mada autor preferira staru, pa bolje nadjite nju. Takodje, pametno bi bilo procitati neku dobru knjizicu o administraciji UNIX sistema (ili za Linux), kako bi se student upoznao sa osnovnim UNIX konceptima.

Autor ovog teksta je Bankovic Milan student Matematickog fakulteta u Beogradu. Sve primedbe, ispravke, kritike, sugestije i ostalo slati na [email protected] .

Puno pozdrava od Milana. Srecan rad!

2

Page 3: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Ulaz i izlaz fajlova

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>

int open(const char *pathname, int oflag);int open(const char *pathname, int oflag, mode_t mode);

Opis:Otvara datoteku cija je putanja data stringom pathname, i vraca fajl deskriptor otvorenog fajla (pozitivan ceo broj). U slucaju greske (npr. nepostojanje fajla ili nedozvoljen pristup) vraca -1; Putanja se zadaje kao apsolutna (pocinje sa / ) ili kao relativna. oflag odredjuje nacin rada sa fajlom; Vrednosti su date u tabeli:

O_RDONLY Otvara fajl samo za citanje (uspeva ako process ima pravo za citanje)O_WRONLY Otvara fajl samo za pisanje (uspeva ako process ima pravo pisanja)

O_RDWR Otvara fajl i za citanje i za pisanje (potrebna oba prava da bi uspelo)O_APPEND Pre svakog pisanja se offset fajla postavlja na kraj (dopisivanje)O_CREAT Ukoliko fajl ne postoji, dozvoljava se njegovo kreiranjeO_EXCL Koristi se zajedno sa O_CREAT; ukoliko fajl vec postoji prijavljuje gresku.

O_TRUNC Brise sadrzaj fajla (tj. Postavlja mu duzinu na nulu).O_NONBLOCK Sprecava blokiranje pri ulazu i izlazu sa terminala i soketa.

O_SYNC Sinhronizuje upis: svaki poziv write funkcije ceka da se fizicki izvrsi upis na disk.O_ASYNC Asinhroni upis: kada deskriptor bude raspoloziv procesu se salje signal SIGIO

O_NOCTTY Sprecava alokaciju kontrolnog terminala, ako putanja pokazuje na njega

Vise flagova se specifira koriscenjem bitskog-ili-operatora ( | ). Pri tom se od prva tri mora navesti jedan i samo jedan. Ostali se mogu slagati po zelji.mode se koristi za podesavanje prava pristupa za novokreirane fajlove. Tip mode_t je neki od celorojnih tipova. Vise podataka o tome kasnije u ovom tekstu.Tri predefinisana fajl deskriptora su STDIN_FILENO (0) ,STDOUT_FILENO (1), STDERR_FILENO (2).Fajl descriptor koji se dodeljuje novootvorenom fajlu je najmanji prirodan broj koji nije vec iskoriscen.

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>

int creat(const char * pathname, mode_t mode);

Opis:Stvara novu datoteku zadatu putanjom, sa pravom pristupa zadatim modom. Vraca fajl deskriptor (jer je automatski otvara samo za pisanje), u slucaju greske vraca -1; Ako fajl vec postoji otvara ga samo za pisanje, brise njegov sadrzaj. Ovo je ekvivalentno sa open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode).Ovaj poziv je kod danasnjih UNIX sistema potpuno nepotreban.

3

Page 4: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <unistd.h>

int close( int filedes);

Opis:Zatvara fajl zadat fajl deskriptorom. Vraca 0 ako uspe, u suprotnom vraca -1;NAPOMENA: UNIX sam zatvara sve fajlove nekog procesa kada se taj proces zavrsi. Funkcija close()se koristi kada imamo veliki broj otvorenih fajl deskriptora, kako ne bismo prekoracili maksimum otvorenih fajlova definisanih za jedan proces.

#include <sys/types.h>#include <unistd.h>

int lseek(int filedes, off_t offset, int whence);

Opis:Podesava tekuci fajl offset. Fajl je zadat deskriptorom, relativni offset dat celim brojem (off_t offset), a pozicija u odnosu na koju posmatramo relativni offset se zadaje parametrom whence. Moguce su tri vrednosti:

SEEK_SET U odnosu na pocetak (najcesce vrednost je 0)SEEK_CUR U odnosu na tekucu poziciju (vrednost je 1)SEEK_END U odnosu na kraj fajla (vrednost je 2)

Funkcija vraca novi fajl offset (apsolutni, tj. u odnosu na pocetak fajla).

#include <unistd.h>

size_t read(int filedes, void* buff, size_t nbytes);

Opis:Funkcija iz otvorenog fajla cita najvise nbytes bajtova, i smesta ih u bafer na koji pokazuje drugi parameter.Vraca -1 u slucaju greske, 0 u slucaju kraja fajla, a inace pozitivan broj procitanih bajtova. Ovaj broj moze biti manji od treceg parametra, i to nije greska. Fajl mora biti otvoren kao O_RDONLY ili kao O_RDWR.

#include <unistd.h>

size_t write(int filedes, const void * buff, size_t nbytes);

Opis:Funkcija upisuje u fajl nbytes bajtova, procitanih iz bafera. Vraca broj upisanih bajtova, -1 u slucaju greske.U ovom slucaju je greska i ako vrati pozitivan broj manji od treceg parametra. Fajl mora biti otvoren za pisanje ili citanje i pisanje.

4

Page 5: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <unistd.h>

int dup(int filedes);int dup2(int filedes,int filedes2);

Opis:Otvara novi fajl deskriptor koji pokazuje na isto polje fajl tabele kao i filedes. Vraca -1 ako je doslo do greske, inace vraca novi fajl descriptor. Novom fajl deskriptoru se uvek iskljucuje FD_CLOEXEC. Fajl deskriptor je najmanji ceo broj koji je dostupan. U slucaju dup2 funkcije, fajl descriptor je upravo drugi parameter. Ako je taj deskriptor vec otvoren, biva najpre zatvoren, pa zatim iskoriscen za dupliciranje prvog deskriptora. Ako su oba parametra jednaka, dup2 vraca tu vrednost bez zatvaranja deskriptora.

#include <sys/types.h>#include <unistd.h>#include <fcntl.h>

int fcntl(int filedes, int cmd, … /*int arg */ );

Opis:Funkcija se koristi za podesavanje flagova otvorenog deskriptora. Komanda se zadaje vrednoscu parametra cmd. Moguce komande su (za sada interesantne):

- F_DUPFD: koristi se za duplikaciju fajl deskriptora. Ova komanda se preklapa sa dup i dup 2 funkcijama. Funkcija duplicira fajl descriptor i vraca vrednost novog deskriptora; novi descriptor je prvi dostupni broj veci ili jednak trecem parametru; FD_CLOEXEC se iskljucuje za novi descriptor. Primetimo da je u skladu sa ovim:

dup(filedes); fcntl(filedes,F_DUPFD,0);dup2(filedes1,filedes2); close(filedes2); fcntl(filedes1,F_DUPFD,filedes2);

-F_GETFD: koristi se za citanje fajl deskriptor flagova. Koristi se jedino FD_CLOEXEC. Treci parametar je 0;-F_SETFD: koristi se za postavljanje fajl deskriptor flagova; Vrednost se cita sa treceg parametra. Preporucuje se umesto kostante FD_CLOEXEC koristiti 0 (no-close-on-exec) i 1 (do-close-on-exec).-F_GETFL: vraca fajl status flagove iz fajl tabele. Vrednosti O_APPEND, O_SYNC, O_ASYNC, O_NONBLOCK se ocitavaju tako sto se vracena vrednost bitski konjuguje sa odgovarajucim flagom (&).Sto se tice O_RDONLY, O_WRONLY, O_RDWR, oni se moraju najpre konjugovati sa vrednoscu O_ACCMODE, a zatim porediti sa odgovarajucim flagom. Treci parametar je 0;

Primer:val=fcntl(filedes,F_GETFL,0);accmode=val & O_ACCMODE;if(accmode == O_RDONLY) …if(val & O_APPEND) …

-F_SETFL: koristi se za postavljanje flagova u fajl tabeli. Vrednosti se zadaju trecim parametrom, kao disjunkcija flagova O_SYNC, O_ASYNC, O_APPEND, i O_NONBLOCK. Nenavedeni flagovi se iskljucuju.

5

Page 6: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Fajlovi i Direktorijumi

#include <sys/types.h>#include <sys/stat.h>

int stat ( const char * pathname, struct stat *buff);int fstat ( int filedes, struct stat *buff);int lstat ( const char * pathname, struct stat *buff);

Opis:Funkcije popunjavaju strukturu na koju pokazuje pokazivac buff. U njoj se nalaze podaci o karakteristikama fajla. Najveci deo tih podataka cita se iz i-node tabele, osim broja i-noda koji se cita iz polja u direktorijumu.Struktura stat definisana je na sledeci nacin:

struct stat {mode_t st_mode; /* tip fajla & dozvole; */ino_t st_ino; /* broj i-node */dev_t st_dev; /* broj uredjaja na kome je fajl */ dev_t st_rdev; /* broj uredjaja za specijalne fajlove */nlink_t st_nlink; /* broj linkova */uid_t st_uid; /* ID vlasnika fajla */gid_t st_gid; /* ID grupe koja poseduje fajl */off_t st_size; /* velicina fajla u bajtovima */time_t st_atime; /* vreme poslednjeg pristupa */time_t st_mtime; /* vreme poslednje modifikacije */time_t st_ctime; /* vreme poslednje izmene i-node tabele */long st_blksize; /* najbolja velicina I/O bloka */long st_blocks; /* broj 512-bajta velikih blokova koji su alocirani */

};

Bitno je napomenuti da stat funkcije ne generisu dinamicki objekat tipa struct stat, vec samo popunjavaju vec postojecu strukturu. Zato pokazivac buff mora pokazivati na vec postojeci objekat. Funkcije vracaju -1 u slucaju greske, 0 ako je sve u redu. Stat i lstat rade sa putanjom fajla, dok fstat radi sa fajl deskriptorom (ako je fajl vec otvoren). Osnovna karakteristika lstat funkcije je da u slucaju da je u pitanju simbolicki link, ne ocitava podatke fajla na koji pokazuje link vec samog linka (za razliku od stat f-je).Tip fajla se ocitava iz clana st_mode. Moguci tipovi kao i makroi kojima se ocitavaju su sledeci:

S_ISREG() Regularni fajl. Moze biti binarni i tekstualni. Kernel medju njima ne pravi razliku.S_ISDIR() Direktorijum. Ovaj fajl sadrzi listu fajlova kao i odgovarajucih i-node brojeva.S_ISCHR() Specijalni karakter fajl. Sluzi za obelezavanje pojedinih uredjaja.S_ISBLK() Specijalni blok fajl. Slicno kao i predhodni, najcesce za diskove.S_ISFIFO() Pipe ili FIFO; sluzi za komunikaciju izmedju procesaS_ISLNK() Simbolicki link;

S_ISSOCK() Soket; sluzi za mreznu komunikaciju medju procesima; Svim ovim makroima se predaje st_mode clan strukture stat. Vracaju 1 ako jeste, 0 ako nije u pitanju odgovarajuci tip.

6

Page 7: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Dozvole se takodje ocitavaju iz st_mode clana sledecim flagovima:

S_IRUSR Pravo citanja za vlasnika fajla.S_IWUSR Pravo pisanja za vlasnika fajla.S_IXUSR Pravo izvrsavanja za vlasnika fajla.S_IRGRP Pravo citanja za grupu koja je vlasnik fajla.S_IWGRP Pravo pisanja za grupu koja je vlasnik fajla.S_IXGRP Pravo izvrsaavanja za grupu koja je vlasnik fajla.S_IROTH Pravo citanja za ostale korisnike.S_IWOTH Pravo pisanja za ostale korisnike.S_IXOTH Pravo izvrsavanja za ostale korisnike.S_IRWXU Sva prava za vlasnika.S_IRWXG Sva prava za grupu.S_IRWXO Sva prava za ostale clanove.S_ISUID Set-user-ID bit.S_ISGID Set-group-ID bit.S_ISVTX Sticky bit.

Svi flagovi(osim S_IRWXx flagova) se ocitavaju tako sto se izvrsi konjukcija st_mode i odgovarajuceg flaga i zatim uporedi sa nulom. Za promenu odgovarajucih flagova koristi se chmod funkcija.Novi fajlovi se stavljaju u vlasnistvo onog korisnika koji je vlasnik procesa (misli se na efektivni user ID).Slicno vazi i za grupu, s tim da ako je u direktorijumu u kome se kreira fajl postavljen set-group-ID onda je grupa vlasnik fajla upravo grupa koja poseduje direktorijum.Dozvole za novi fajl odredjuju se mode parametrom creat odnosno open funkcije. Od toga se oduzima UMASK vrednost.

#include <unistd.h>

int access(const char* pathname, int mode);

Opis:Koristi se za utvrdjivanje dozvola koje ima pravi vlasnik procesa( real user ID). Pri tom je mode ekskluzivno ili nekih od konstanti: R_OK, W_OK, X_OK, F_OK, pri cemu redom znace pravo na citanje, pisanje, egzekuciju, kao i ispitivanje postojanja fajla( ovo poslednje je veoma korisno). Vraca 0 za OK, -1 za gresku.

#include <sys/types.h>#include <sys/stat.h>

mode_t umask(mode_t cmask); Opis:Postavlja UMASK vrednost na cmask, i vraca predhodnu masku. Argument je sastavljen od bitskih disjunkcija flagova iz prethodne tabele. Umask vrednost je jedan od parametara procesa koji se prenose svim child procesima.

7

Page 8: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <sys/stat.h>#include <sys/types.h>

int chmod(const char * pathname, mode_t mode);int fchmod(int filedes , mode_t mode);

Opis:Funkcije menjaju dozvole za fajl zadat putanjom, odnosno fajl deskriptorom. Mod je bitska disjunkcija flagova iz prethodne tabele. Funkcije vracaju 0 u slucaju uspeha, -1 u slucaju greske. Dozvole za fajl moze menjati samo vlasnik fajla ili administrator (root). To se gleda na osnovu efektivnog ID-a;

#include <sys/types.h>#include <unistd.h>

int chown(const char *pathname,uid_t owner,gid_t group);int fchown(int filedes,uid_t owner,gid_t group);int lchown(const char *pathname,uid_t owner,gid_t group);

Opis:Funkcije menjaju vlasnika fajla kao i grupu koja poseduje fajl. Prefiksi f i l deluju isto kao i u slucaju stat funkcije. Prava promene ima samo superuser (za promenu vlasnika) a promenu grupe moze izvrsiti i vlasnik fajla i to samo za grupu kojoj pripada. (jedna od suplementarnih grupa ili efektivna grupa). Vracaju 0 za OK, -1 za gresku.

#include <sys/types.h>#include <unistd.h>

int truncate(const char * pathname, off_t length);int ftruncate(int filedes, off_t length);

Opis:Funkcije menjaju duzinu fajla (odbacujuci pri tom suvisne podatke). Produzavanje fajla zavisi od implementacije. Vracaju 0 ako je u redu, a -1 u slucaju greske.

#include <unistd.h>

int link(const char *existingpath, const char *newpath);int unlink(const char *pathname);

Opis:Funkcija link stvara novi zapis u direktorijumu koji pokazuje na postojeci i-node. Pri tom se brojac linkova u i-node zapisu uvecava za 1. Ovo je atomicna operacija. Sadrzaj nekog fajla se uklanja tek kada se broj linkova smanji na nulu i kada nema vise otvorenih deskriptora koji rade sa tim fajlom. Funkcija unlink uklanja zapis u direktorijumu. Funkcija ne prati simbolicke linkove vec se unlinkovanje odnosi na simbolicki link.Obe funkcije vracaju 0 ako je sve u redu, -1 u slucaju greske.

8

Page 9: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <stdio.h>

int remove(const char *pathname);int rename(const char *oldname, const char *newname);

Opis:Funkcija remove je identicna kao unlink za obicne fajlove, a kao rmdir za direktorijume.Funkcija rename zamenjuje link oldname linkom newname. Ako newname vec postoji tada ga uklanja.U slucaju direktorijuma zahteva se da bude prazan. Vracaju 0 u slucaju uspeha, -1 u slucaju greske;

#include <unistd.h>

int symlink(const char *actualpath, const char *sympath);int readlink(const char *pathname, char * buff, int bufsize);

Opis:Funkcija symlink kreira simbolicki link. Vraca 0 u slucaju uspeha, -1 u slucaju greske;Funkcija readlink cita sadrzaj simbolickog linka i smesta ga u buff. Najveca dozvoljena velicina data je trecim parametrom. Funkcija ne upisuje ‘\0’ na kraju stringa; vraca broj procitanih znakova u slucaju uspeha, -1 u slucaju greske;

#include <sys/types.h>#include <utime.h>

int utime(const char *pathname, const struct utimbuf *times);

struct utimbuf {time_t actime; /* vreme pristupa */time_t modtime; /* vreme modifikacije */

};

Opis:Ovom funkcijom se postavljaju st_atime i st_mtime u i-node strukturi fajla. Nije moguce postaviti st_ctime jer se ovo vreme odnosi na i-node i automatski se menja utime funkcijom. Ako je drugi parametar NULL, vremena se postavljaju na trenutno vreme. Za to je potrebno biti superuser, vlasnik fajla ili imati dozvolu za pisanje za taj fajl. Ako je drugi parametar razlicit od nule tada se vremena postavljaju na odgovarajuca vremena iz gornje strukture. Za ovo moramo biti superuser ili vlasnik fajla. Vraca 0 za OK, -1 u slucaju greske.

#include <sys/types.h>#include <sys/stat.h>

int mkdir(const char *pathname, mode_t mode);

Opis:Funkcija stvara novi prazan direktorijum sa datim pravima pristupa. Vraca 0 odnosno -1 u slucaju greske;Od prava pristupa se oduzima UMASK;

9

Page 10: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <unistd.h>

int rmdir(const char *pathname);

Opis:Funkcija uklanja link direktorijuma zadatog putanjom. Direktorijum mora biti prazan. Ako se brojac linkova smanji na 0 ovim pozivom i ukoliko nema procesa koji imaju otvoren ovaj direktorijum on se uklanja. Vraca -1 u slucaju greske, 0 inace.

#include <sys/types.h>#include <dirent.h>

DIR *opendir( const char *pathname);struct dirent *readdir(DIR *dp);void rewinddir(DIR *dp);int closedir(DIR *dp);

Opis:Funkcija opendir otvara direktorijum za citanje i vraca deskriptor tipa DIR. Vraca NULL u slucaju greske;Funkcija readdir cita naredni zapis u direktorijumu i smesta ga u dirent strukturu (koja se svaki put ponovo ispisuje za jedan otvoreni direktorijum). Struktura dirent ima sledeci oblik:

struct dirent {char d_name[NAME_MAX+1]; /* ime fajla */ino_t d_ino; /* broj i –noda */

};

Funkcija readdir vraca pokazivac na ispisanu strukturu ili NULL u slucaju greske ili kraja direktorijuma.Funkcija rewinddir vraca citanje na prvi zapis u direktorijumu.Funkcija closedir zatvara direktorijum, vraca -1 u slucaju greske, inace 0;

#include <unistd.h>

int chdir(const char *pathname);int fchdir(int filedes);char *getcwd(char *buff, size_t size);

Opis:Funkcija chdir menja tekuci direktorijum na onaj specificiran pathname-om. Vraca 0 odnosno -1 u slucaju greske. Slicno radi i fchdir, s tim sto se direktorijum zadaje fajl deskriptorom (ako je direktorijum vec otvoren). Funkcija getcwd upisuje u bafer na koji pokazuje buff apsolutnu adresu tekuceg direktorijuma. Vraca buff ili NULL u slucaju greske. Greska nastaje ako je bafer nedovoljno veliki da prihvati sve karaktere putanje plus ‘\0’ koji se pri tom dodaje na kraju stringa.

10

Page 11: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Standardna I/O biblioteka

#include <stdio.h>

void setbuf(FILE *fp,char *buff);int setvbuf(FILE *fp, char *buff, int mode, size_t size);

Opis:Funkcije podesavaju baferovanje standardne biblioteke. setbuf iskljucuje baferovanje ako je pokazivac buff jednak NULL. U suprotnom je ukljuceno potpuno baferovanje, pri cemu bafer mora biti velicine BUFSIZ koja je definisana u zaglavlju. setvbuf ima mogucnost podesavanja baferovanja parametrom mode. Moguce vrednosti su _IOFBF (puno baferovanje) _IOLBF (linijsko ) _IONBF (bez baferovanja); Ako se baferovanje iskljuci parametri buff i size se ignorisu. Videti tabelu:

Funkcija Mode buff Bafer i duzinasetbuf !=NULL Koristi buff velicine BUFSIZ

NULL Bez baferovanjasetvbuf _IOFBF !=NULL Koristi buff duzine size

NULL Sistemsko baferovanje_IOLBF !=NULL Koristi buff duzine size

NULL Sistemsko baferovanje_IONBF ignorisan Bez baferovanja

Funkcija setvbuf() vraca 0 za OK razlicito od nule u slucaju greske!

#include <stdio.h>

int fflush(FILE *fp);

Opis:Funkcija salje podatke iz bafera kernelu i zatim prazni bafer. Ako je fp NULL tada se prazne svi otvoreni izlazni baferi. Vraca 0 za uspeh, EOF za gresku.

#include <stdio.h>

FILE *fopen(const char *pathname, const char *type);FILE *freopen(const char *pathname, const char *type,FILE *fp);FILE *fdopen(int filedes, const char *type);

Opis:Otvaraju tok, i vracaju FILE pokazivac. Vracaju NULL u slucaju greske. Parametar type pokazuje na string koji moze biti: “r” za citanje, “w” za pisanje (ako fajl postoji njegov sadrzaj se brise, ako ne postoji kreira se), “a” za dopisivanje, “r+” za citanje i pisanje, “w+” citanje i pisanje uz prethodno brisanje sadrzaja fajla, “a+” slicno kao i predhodno, s tim sto se citanje i pisanje vrsi na kraju fajla. Funkcija freopen, zatvara fp ako je otvoren a zatim ga ponovo otvara za fajl definisan putanjom. Funkcija fdopen otvara tok za vec otvoreni fajl deskriptor.

11

Page 12: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <stdio.h>

int fclose(FILE *fp);

Opis:Zatvara tok i vraca 0 ako uspe, EOF u slucaju greske. Podaci se iz bafera prosledjuju kernelu pre zatvaranja.

#include <stdio.h>

int getc(FILE *fp);int fgetc(FILE *fp);int getchar(void);

Opis:Ucitavaju jedan znak sa toka i vracaju njegovu vrednost. U slucaju greske vracaju EOF kao i u slucaju kraja fajla. getchar() koristi stdin (standardni ulaz). getchar() i getc() mogu biti implementirane kao makroi dok je fgetc() garantovano funkcija.

#include <stdio.h>

int ferror(FILE * fp);int feof(FILE *fp);void clearerr(FILE *fp);

Opis:Proveravaju da li je nastupila greska ili kraj fajla. Ovo je neophodno jer funkcije ulaza vracaju EOF u oba slucaja. Funkcija clearerr iskljucuje oba flaga ako su ukljuceni.

#include <stdio.h>

int putc(int c,FILE *fp);int fputc(int c,FILE *fp);int putchar(int c);

Opis:Funkcije upisuju karakter u tok (u slucaju putchar() to je stdout). Vracaju upisani karakter ili EOF u slucaju greske;

12

Page 13: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <stdio.h>

char *fgets(char *buff, int n,FILE* fp);char *gets(char *buff);

Opis:Funkcija fgets uzima najvise n znakova iz toka i smesta ih u bafer. Citanje se zavrsava kada se naidje na znak za novi red (ucitava se i ‘\n’), kada se dodje do EOF (ne ucitava se) ili kada se ucita n-1 karaktera. Na kraju se upisuje ‘\0’. Vraca buff ili NULL u slucaju greske ili kraja fajla.Funkcija gets ucitava sa standardnog ulaza niz karaktera sve dok ne naidje na znak za novi red. Ona ovaj znak ne upisuje vec ga zamenjuje terminatorom stringa. Vraca isto sto i fgets.

#include <stdio.h>

int fputs(const char *buff, FILE* fp);int puts(const char *buff);

Opis:Upisuju u tok niz znakova dok ne naidju na znak za kraj stringa. ‘\0’ se ne upisuje, ali puts umesto njega upisuje znak za novi red, dok fputs to ne cini. Funkcija puts radi sa stdout-om. Vracaju nenegativnu vrednost u slucaju uspeha, EOF u slucaju greske.

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);

Opis:Upisuju ili citaju niz duzine nobj objekata velicine size u tok ili iz toka fp; Vracaju broj objekata koji su ucitani odnosno upisani.

#include <stdio.h>

long ftell(FILE *fp);int fseek(FILE *fp, long offset, int whence);void rewind (FILE *fp);

Opis:ftell vraca tekuci ofset fajla ili -1L u slucaju greske, fseek podesava ofset (isto kao i lseek) i vraca 0 za uspeh !=0 u slucaju greske; Funkcija rewind postavlja fajl ofset na pocetak fajla.

13

Page 14: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <stdio.h>

int printf(const char *format, … );int fprintf(FILE * fp, const char *format, … );int sprintf(char * buff, const char *format, …);

Opis:Funkcije sluze za formatizovani izlaz. printf ispisuje na standardni izlaz, fprintf koristi tok fp, a sprintf upisuje u bafer na koji pokazuje buff. Ova funkcija dopisuje i terminator stringa na kraju bafera. Funkcije vracaju broj ispisanih karaktera, ili negativnu vrednost u slucaju greske.

#include <stdio.h>

int scanf(const char *format, … );int fscanf(FILE *fp, const char *format, … );int sscanf(const char* buff, const char *format, … );

Opis:Funkcije se koriste za formatizovan ulaz. Scanf ucitava sa standardnog ulaza, fscanf iz toka fp a sscanf koristi bafer na koji pokazuje buff. Funkcija vraca broj procitanih ulaznih podataka, EOF u slucaju greske ili kraja fajla pre bilo kog procitanog podatka.

#include <stdio.h>

int fileno(FILE *fp);

Opis:Funkcija vraca fajl deskriptor za tok na koji pokazuje fp.

14

Page 15: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Sistemske informacije

#include <sys/types.h>#include <pwd.h>

struct passwd *getpwuid(uid_t uid);struct passwd *getpwnam(const char *name);

Opis:Funkcije se koriste za citanje podataka o korisniku iz fajla /etc/passwd. Format zapisa u ovom fajlu je oblika:

username:password:uid:gid:about:homedir:shell

Password je u kriptovanom obliku i najcesce se ne cuva u samom passwd fajlu vec u fajlu /etc/shadow. Ovi podaci se smestaju u strukturu passwd, koja izgleda ovako:

struct passwd {char *pw_name; /* Korisnicko ime */char *pw_passwd; /* Kriptovana sifra */uid_t pw_uid; /* Korisnicki ID */gid_t pw_gid; /* Korisnicka podrazumevana grupa */char *pw_gecos; /* Komentar (about) */char *pw_dir; /* Home direktorijum */char *pw_shell; /* Default shell */

};

Gornje funkcije ispunjavaju strukturu koja je staticki podatak unutar same funkcije, pa se svakim pozivom prethodni sadrzaj brise. Funkcije u slucaju greske vraca NULL;

#include <sys/types.h>#include <pwd.h>

struct passwd *getpwent(void);void setpwent(void);void endpwent(void);

Opis:Funkcije se koriste za iscitavanje celog fajla /etc/passwd. Funkcija getpwent svakim pozivom vraca sledeci unos iz fajla (i otvara ga pri prvom pozivu), funkcija setpwent otvara fajl ako vec nije otvoren ,inace resetuje citanje na pocetak (za ponovno citanje fajla pocev od prvog unosa). Funkcija endpwent zatvara fajl; Funkcija getpwent vraca pokazivac na staticki clan unutar same funkcije, dok vraca NULL u slucaju greske ili kraja fajla.

15

Page 16: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <sys/types.h>#include <grp.h>

struct group *getgrgid(gid_t gid);struct group *getgrnam(const char *name);

Opis:Analogno kao i prethodni slucaj samo za grupe: dakle, funkcije citaju iz fajla /etc/group zapis oblika:

group:password:gid:user1,user2,…

Ovim podacima ispunjava se struktura koja je staticki clan unutar same funkcije. Funkcija vraca NULL u slucaju greske. Struktura je oblika:

struct group {char *gr_name; /* Ime grupe */char *gr_passwd; /* Kriptovana sifra */gid_t gr_gid; /* Grupni ID */char **gr_mem; /* Niz stringova koji predstavljaju korisnike */

};

#include <sys/types.h>#include <grp.h>

struct group *getgrent(void);void setgrent(void);void endgrent(void);

Opis:Potpuno analogno kao i u slucaju funkcija za ocitavanje passwd fajla. Dakle, getgrent vraca pokazivac na staticki clan koji prethodno ispuni podacima iz sledeceg zapisa u fajlu /etc/group. U slucaju da odgovarajuci fajl nije vec otvoren otvara ga.Vraca NULL u slucaju greske ili kraja fajla. Funkcija setgrent vraca citanje na pocetak fajla i otvara fajl, ako prethodno nije bio otvoren. Funkcija endgrent zatvara fajl.

16

Page 17: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <sys/types.h>#include <unistd.h>

int getgroups(int gidsetsize, gid_t grouplist[] );int setgroups( int ngroups, const gid_t grouplist[] );int initgroups(const char *username, gid_t basegid);

Opis:Getgroups ucitava u odgovarajuci niz ID brojeve suplementarnih grupa kojima pripada vlasnik procesa. Ucitava se njih najvise gidsetsize, a vraca se broj ucitanih ID-a, ili -1 u slucaju greske. Setgroups postavlja suplementarne grupe (njih najvise ngroups ). Vraca 0 u slucaju uspeha, -1 u slucaju greske. Moze je pozivati samo superuser. Initgroups se poziva samo od strane superuser-a i njome se interno pozivaju sve pomenute funkcije za citanje grupnih fajlova. basegid je ID grupe iz passwd fajla za odgovarajuceg korisnika. Funkcija vraca 0 za OK -1 za gresku.

#include <sys/utsname.h>

int uname(struct utsname *name);

Opis:Ova funkcija ispunjava strukturu utsname. U njoj se nalaze podaci o sistemu. Ova struktura ima oblik:

struct utsname {char sysname[9];char nodename[9];char release[9];char version[9];char machine[9];

}; Funkcija vraca 0 za OK -1 za gresku.

#include <unistd.h>

int gethostname(char *name, int namelen);

Opis:Funkcija upisuje u string ime host-a, maksimalna duzina zadata je drugim parametrom. Vraca 0 za OK -1 za gresku.

17

Page 18: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <time.h>

time_t time(time_t *calptr);

Opis:Funkcija vraca vreme u sekundama. Ako parameter nije nula, tada se ista vrednost upisuje i u lokaciju na koju parameter pokazuje. Vraca -1 u slucaju greske!Osim u ovom formatu vreme se pod UNIX-om prikazuje i u obliku sledece strukture:

struct tm { int tm_sec; /* Sekunde nakon minuta [0 61] */

int tm_min; /* Minuti nakon casa [0 59] */int tm_hour; /* Sati nakon ponoci [0 23] */int tm_mday; /* Dani u mesecu [1 31] */int tm_mon; /* Meseci u godini [0 11] */int tm_year; /* Godina nakon 1900-te */int tm_wday; /* Dani posle nedelje [0 6[ */int tm_yday; /* Dani nakon prvog januara [0 365] */int tm_isdst; /* Flag za daylight saving <0 , 0, >0 */

};

time_t vreme se u struct tm konvertuje sledecim funkcijama:

#include <time.h>

struct tm* gmtime(const time_t *calptr);struct tm* localtime(const time_t *calptr);

Opis:Prva funkcija konvertuje time_t vreme u UTC vreme, dok druga daje lokalno vreme;

#include <time.h>

time_t mktime(struct tm *tmptr);char *asctime(const struct tm *tmptr);char *ctime(const time_t *calptr);

Opis:Funkcija mktime konvertuje vreme zapisano kao lokalno u tm strukturi u time_t vreme,vraca -1 u slucaju greske. Funkcija asctime vraca formatiran zapis vremena zadatog kao lokalno tm vreme. Slicno radi i ctime s tim sto joj je argument pokazivac na time_t vreme;

18

Page 19: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Okruzenje UNIX procesa

#include <stdlib.h>void exit(int status);

#include <unistd.h>void _exit(int status);

Opis:Funkcije se koriste za normalan zavrsetak programa. Razlika je u tome sto exit() prethodno poziva odgovarajuce exit handlere, kao i sto prazni sve izlazne bafere U/I biblioteke i salje ih kernelu na fizicko upisivanje. _exit() odmah bezuslovno zavrsava program.

#include <stdlib.h>int atexit(void (*func) (void) );

Opis:Funkcija se koristi za registrovanje exit handlera. Vraca 0 za uspesno registrovanje, !=0 za gresku.

#include <stdlib.h>void* malloc(size_t size);void* calloc(size_t nobj, size_t size);void* realloc(void *ptr, size_t newsize);void free(void * ptr);

Opis:Fukcije sluze za dinamicku alokaciju i oslobadjanje memorije. Prve tri funkcije vracaju pokazivac na alocirani prostor, ili NULL u slucaju greske. Kod malloc() zadajemo broj bajtova, kod calloc() broj objekata i pojedinacnu velicinu svakog objekta, a kod realloc() zadajemo pokazivac koji vec pokazuje na neku dinamicki alociranu memoriju (koristimo je za prosirivanje ili suzavanje alociranog prostora). free() oslobadja prostor koji je alociran nekom od gornjih funkcija. Ako je argument NULL ne radi nista;

#include <stdlib.h>char *getenv(const char* name);int putenv(const char *str);int setenv(const char *name,const char *value,int rewrite);void unsetenv(const char *name);

Opis:Funkcije barataju sa globalno definisanim pokazivacem extern char **environ. On pokazuje na niz stringova od kojih je svaki u obliku “name=value”; Funkcija getenv() vraca string koji predstavlja vrednost za promenljivu name. Vraca NULL ako ime nije definisano. Funkcija putenv() postavlja novi string u environ. On mora biti oblika “name=value”; Ako promenljiva vec postoji, najpre se brise, a zatim postavlja nova vrednost. Funkcija setenv() podesava vrednost promenljive. Pri tom flag rewrite omogucava promenu vrednosti za promenljivu koja vec postoji. Ako je 1 tada se postojeca vrednost menja na novu vrednost, dok se u slucaju da je 0 nova vrednost ne postavlja (odnosno funkcija ne radi nista ako promenljiva vec postoji, i ne vraca gresku). Prethodne dve funkcije vracaju 0 za uspeh, !=0 za gresku. Funkcija unsetenv() uklanja promenljivu ako postoji.

19

Page 20: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Kontrola procesa

#include <sys/types.h>#include <unistd.h>

pid_t getpid(void);pid_t getppid(void);uid_t getuid(void);uid_t geteuid(void);gid_t getgid(void);gid_t getegid(void);

Opis:Ove funkcije redom vracaju process ID, parent process ID , real user ID, effective user ID, real group ID , effective group ID. Nema gresaka!

#include <sys/types.h>#include <unistd.h>

pid_t fork();

Opis:Funkcija sluzi za kreiranje novog procesa. Funkcija duplicira postojeci proces, jedino sto se menja je PID, PPID, vremena izvrsavaja procesa se postavljaju na 0, svi pending signali se iskljucuju, kao i eventualni alarm.Ono sto je jos razlicito je povratna vrednost: u child-u je 0 , dok je u parent-u upravo PID vrednost novostvorenog child procesa. Funkcija vraca -1 u slucaju greske, i u tom slucaju se novi proces ne kreira. Novostvoreni proces deli fajl tabele sa parent procesom (tj. imaju zajednicki offset).

#include <sys/types.h>#include <sys/wait.h>

pid_t wait(int *statloc);pid_t waitpid(pid_t pid,int *statloc, int options);

Opis:Funkcije cekaju child proces da zavrsi rad. Ako je statloc razlicit od NULL tada u tu lokaciju upisuju zavrsni status child procesa koji je sacekan. Funkcije vracaju PID procesa koji je zavrsen. Funkcija wait() blokira rad programa ako ni jedan child proces nije zavrsio rad. Ona vraca -1 ako ne postoji ni jedan child proces. Funkcija waitpid() ima mogucnost cekanja odredjenog procesa. On se navodi prvim parametrom. U slucaju da ne postoji child proces sa tim PID-om vraca gresku -1; Ako postoji i nije zavrsio waitpid() blokira. Ako je zavrsio funkcija vraca njegov PID i upisuje njegov zavrsni status u lokaciju na koju pokazuje drugi parameter. Takodje je moguce postaviti pid na -1 (ceka bilo koji proces, tj. kao wait) , 0 (ceka bilo koji child proces koji ima isti PGID kao i pozivajuci proces), <-1(ceka bilo koji proces koji ima PGID kao apsolutna vrednost parametra). Opcije se mogu postaviti na 0 (ako ne zelimo nikakve dodatne opcije), a moguci flagovi su: WNOHANG – za sprecavanje blokiranja (ako proces jos nije zavrsio, nastaviti dalje, pri cemu vraca 0). WUNTRACED – za omogucavanje detekcije stopiranih procesa;

20

Page 21: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Za odredjivanje zavrsnog statusa koristimo sledece makroe:

WIFEXITED(status): vraca 1 ako je proces na normalan nacin zavrsio rad. U tom slucaju povratnu vrednost exit() komande odredjujemo makroom:

WEXITSTATUS(status);WIFSIGNALED(status) : vraca 1 ako je proces zavrsio na abnormalan nacin (nekim signalom ili abort funkcijom). U tom slucaju se signal moze ocitati na sledeci nacin:

WTERMSIG(status);Slicno se moze proveriti da li je generisan core fajl (za debagovanje) na sledeci nacin:

WCOREDUMP(status);WIFSTOPPED(status) : Vraca 1 ako je proces stopiran. Signal koji je izazvao stopiranje moze se ocitati sledecim makroom:

WSTOPSIG(status);

#include <unistd.h>

int execl(const char *pathname, const char *arg0, … /* (char*) 0 */ );int execle(const char *pathname, const char *arg0, … /* (char*) 0 , char * const envp[] */ );int execv(const char *pathname, char * const argv[] );int execve(const char *pathname, char * const argv[],char *const envp[] );int execlp(const char *filename, const char *arg0, … /* (char*) 0 */ );int execvp(const char *filename, char * const argv[] );

Opis:Funkcije vrse egzekuciju novog programa zadatog pathname-om u okviru postojeceg procesa. Pozivajuci proces se zamenjuje novim i funkcija ne vraca vrednost. Vraca -1 u slucaju greske. Funkcije sa sufiksom “p” imaju mogucnost zadavanje komandi iz nekog direktorijuma sadrzanog u PATH promenljivoj. Funkcije sa sufiksom “l” zahtevaju listu argumenata kao posebne parametre, pri cemu se lista zavrsava sa (char*) 0, dok one sa sufiksom v zahtevaju niz(vektor) pokazivaca na stringove koji predstavljaju listu argumenata. Prilikom exec-ucije ostaju otvoreni fajl deskriptori za koje nije postavljen FD_CLOEXEC flag (sto je default), nasledjuje se PID, PPID, kao i vecina ostalih parametara, a ono sto se razlikuje moze biti samo effective user ID i effective group ID. Oni se mogu promeniti ako je za izvrsni fajl koji se pokrece postavljen set-user-ID bit (odnosno set-group-ID bit). Za razliku od forka, ovde proces ostaje isti, pa zato isti ostaju i pending signali, alarm tajmeri, kao i proces vremena.

#include <sys/types.h>#include <unistd.h>

int setuid(uid_t uid);int setgid(gid_t gid);

Opis:Funkcije vracaju 0 za uspeh, -1 za gresku. Ako je pozivajuci proces superuser-ov, tada se postavljaju sve tri vrednosti (real-user ID, effective-user ID i saved-set-user ID). Ako je process korisnicki, tada se postavlja samo effective-user, i to pod uslovom da je zahtevana vrednost ili real-user-ID ili saved-set-user-ID. U suprotnom prijavljuje gresku. Set-user-ID se prilikom exec-ucije postavlja na istu vrednost kao i effective-user-ID.

21

Page 22: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <sys/types.h>#include <unistd.h>

int seteuid(uid_t uid);int setegid(gid_t gid);

Opis:Ove funkcije se razlikuju od prethodnih samo u slucaju superusera, i to tako sto ne postavljaju sve tri vrednosti vec samo effective-user-ID. Analogno za grupe. Vracaju 0 za OK, -1 za gresku.

#include <stdlib.h>

int system(const char *cmdstring);

Opis:Ova funkcija izvrsava sistemsku komandu unutar procesa. Ona u stvari predstavlja kombinaciju fork-exec-waitpid funkcija. Funkcija vraca sledece: ako fork ne uspe vraca -1; Ako exec ne uspe vraca 127; inace vraca vrednost koju uhvati waitpid, tj zavrsni status procesa.

#include <unistd.h>

char *getlogin(void);

Opis:Funkcija vraca ime korisnika koji je logovan (tj. koji je real user). Vraca NULL u slucaju greske!

#include <sys/times.h>

clock_t times(struct tms *buff);

Opis:Funkcija ispunjava strukturu koja ima sledeci oblik:

struct tms {clock_t tms_utime; /* user CPU vreme */clock_t tms_stime; /* sistemsko CPU vreme */clock_t tms_cutime; /* korisnicko vreme zavrsenih child procesa */clock_t tms_cstime; /* sistemsko CPU vreme zavrsenih child procesa */

};

Funkcija vraca celokupno vreme koje je utroseno za izvrsavanje procesa (ukljucujuci i vreme dok su se izrsavali drugi procesi , a pozivajuci proces cekao na izvrsenje). Vreme se izrazava u otkucajima casovnika; Funkcija vraca -1 u slucaju greske!

22

Page 23: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Odnosi izmedju procesa

#include <sys/types.h>#include <unistd.h>

pid_t getpgid(pid_t pid);pid_t getpgrp(void);

Opis:Funkcija getpgid() vraca process-group-ID procesa datog pid-om. Svaki proces ima jedinstvenu grupu procesa kojoj pripada, i to je svojstvo koje se nasledjuje prilikom fork-exec komandi. Dakle stvaranjem child procesa, on ostaje u istoj grupi u kojoj je bio i roditelj. U slucaju da je pid==0 vraca process-group-ID pozivajuceg procesa.Funkcija getpgrp() je ekvivalentna sa getpgid(0); Funkcije vracaju -1 u sucaju greske.

#include <sys/types.h>#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid);int setpgrp(void);

Opis:Funkcija setpgid() postavlja grupu pgid za proces pid. Proces moze manjati samo svoju grupu, kao i grupu svojih child procesa (i to pre nego sto pozovu exec() funkciju). Pri tom proces i grupa u koju ga smestamo moraju pripadati istoj sesiji. Ako je prvi parameter 0 tada se odnosi na pozivajuci proces. Ako je drugi parameter 0 tada se grupa procesa zadatog pid-om postavlja na pid. Ova funkcija vraca 0 za uspeh, a -1 za gresku. Ona kreira novu grupu u istoj sesiji ako grupa sa datim PID-om ne postoji. Svaka grupa postoji dokle god u njoj ima procesa. Proces koji ima isti ID kao i grupa naziva se lider procesne grupe. Funkcija setpgrp() je ekvivalentna sa setpgid(0,0);

#include <sys/types.h>#include <unistd.h>

pid_t setsid(void);

Opis:Funkcija otvara novu sesiju (skup jedne ili vise grupa). Ako je tekuci proces vec lider grupe funkcija vraca -1 (tj. gresku). U suprotnom kreira se nova sesija i u njoj grupa sa istim pid-om kao i pid pozivajuceg procesa. On postaje lider grupe, kao i lider sesije. Funkcija vraca pid pozivajuceg procesa. Eventualna veza sa terminalom se raskida.

23

Page 24: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <sys/types.h>#include <unistd.h>

pid_t tcgetpgrp(int filedes);int tcsetpgrp(int filedes, pid_t pgrpid);

Opis:Funkcija tcgetpgrp vraca pid foreground procesne grupe za sesiju kojoj pripada tekuci proces. U slucaju greske vraca -1. pri tom je filedes descriptor povezan sa terminalom. Funkcija tcsetpgrp postavlja pgrpid za foreground proces povezan sa terminalom. Vraca 0 za uspeh, -1 za neuspeh. Inace, vrednost pgrpid mora biti pid grupe iz iste sesija, a filedes mora biti povezan sa terminalom sesije kojoj pozivajuci proces pripada

#include <unistd.h>

int nice( int inc);1

Opis:Funkcija uvecava trenutni prioritet procesa za vrednost inc parametra. Vraca 0 za OK -1 u slucaju greske.Prioritet je na UNIX-u broj izmedju -20 i 20. Pri tom je veci prioritet sto je broj manji. Default prioritet je 0;Obican korisnik moze samo uvecati vrednost prioriteta (odnosno smanjiti “vaznost” svog procesa za sistem), dakle moze za inc uzimati jedino pozitivne vrednosti. Superuser moze uzimati i negativne vrednosti parametra, tj. smanjiti vrednost prioriteta i na taj nacin proces uciniti vaznijim.

#include <sys/time.h>#include <sys/resource.h>

int getpriority(int which, int who);int setpriority(int which, int who, int prio);

Opis:Funkcije ocitavaju i postavljaju prioritet procesa. Prvi parametar which odredjuje da li postavljamo prioritet za korisnika, za proces, ili za procesnu grupu (sto se specificira redom konstantama PRIO_USER, PRIO_PROCESS, PRIO_PGRP). who je ID korisnika, odnosno procesa ili grupe. Treci parametar funkcije setpriority() predstavlja vrednost prioriteta koja se postavlja, i ona je izmedju -20 i 20; Funkcija postavlja prioritet za sve procese odredjene datim parametrima. To znaci da u slucaju da je PRIO_USER u pitanju, prioritet se posmatra za sve procese ciji je vlasnik dat parametrom who. Ako je u pitanju PRIO_PGRP, tada se prioritet posmatra za sve procese koji pripadaju procesnoj grupi. U slucaju da je who==0 tada se koristi ID pozivajuceg procesa, real-user-ID odnosno ID procesne grupe kojoj pripada pozivajuci proces, respektivno vrednostima parametra which. Jedino superuser moze smanjivati prioritet (tj. povecavati vaznost procesa). Isto tako, obicni korisnici ne mogu menjati prioritet procesa koji im ne pripadaju (tj. kojima se efektivni ID razlikuje i od real-user-ID i effective-user-ID pozivajuceg procesa). getpriority() vraca prioritet onog procesa koji ima najmanju vrednost prioriteta, od svih specificiranih procesa. Kako -1 moze biti legitimna povratna vrednost, errno se mora pre poziva ove funkcije ocistiti, a nakon povratka iz funkcije proveriti da li je doslo do greske. Funkcija setpriority() vraca 0 za OK, -1 u slucaju greske.

1 Ovih funkcija nema u APUE-u. Za detalje pogledati man stranice.

24

Page 25: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

Signali

Naziv Opis signala Default akcijaSIGABRT Abnormalan zavrsetak programa (generise ga abort f-ja) Terminacija/generise coreSIGALRM Ovaj signal generise alarm funkcija nakon isteka tajmera. TerminacijaSIGBUS Hardverska greska Terminacija/generise core

SIGCHLD Ovaj signal nastupa prilikom promene statusa child-a, u slucaju da je zavrsio rad ili da je stopiran.

Ignorisanje

SIGCONT Signal se salje procesu koji je stopiran da bi nastavio sa radom.

Nastavak procesa ako je stopiran, inace ignorisanje.

SIGEMT Hardverska greska Terminacija/generise coreSIGFPE Aritmeticki izuzetak (deljenje nulom, itd). Terminacija/generise coreSIGHUP Prekid veze (ovaj signal salje terminal drajver lideru

sesije)Terminacija

SIGILL Nedozvoljena hardverska instrukcija Terminacija/generise coreSIGINFO Zahtev za ispisivanje statusa svih foreground procesa na

terminalu. (Control-T)Ignorisanje

SIGINT Generise se sa Control-C ili DELETE. To je zahtev za prekid svih foreground procesa.

Terminacija

SIGIO Indikacija asinhronog ulaza/izlaza. Terminacija/generise coreSIGIOT Hardverska greska Terminacija/generise core

SIGKILL Bezuslovna terminacija. Ovaj signal se ne moze uhvatiti niti ignorisati.

Terminacija

SIGPIPE Ovaj signal se generise kada proces pise u pipe, a proces koji cita iz pipe-a je terminisan. Slicno i za socket-e.

Terminacija

SIGPROF Slicno kao SIGALRM, samo se postavlja funkcijom setitimer()

Terminacija

SIGPWR Signal generise UPS sistem, kada nestane struja, i kada baterija UPS-a oslabi.

Ignorisanje

SIGQUIT Generise se sa Control-Backslash. Terminise proces. Ovaj signal se salje svim procesima u foreground grupi.

Terminacija/generise core

SIGSEGV Nedozvoljeno koriscenje memorije Terminacija/generise coreSIGSTOP Stopira proces. Ovaj signal ne moze biti uhvacen, niti

ignorisan.Stopiranje procesa.

SIGSYS Nedozvoljen sistemski poziv. Terminacija/generise coreSIGTERM Ovo je signal za terminaciju, generisan sa kill komandom TerminacijaSIGTRAP Hardverska greska Terminacija/generise coreSIGTSTP Stopira sve foreground procese. Generise ga Control-Z. Stopiranje procesaSIGTTIN Salje se background procesu koji pokusava citanje sa

terminala.Stopiranje procesa

SIGTTOU Salje se background procesu koji pokusava pisanje na terminalu.

Stopiranje procesa

SIGURG Indikacija hitnih uslova. IgnorisanjeSIGUSR1 i 2 Korisnicki definisan signal. TerminacijaSIGVTALRM Slicno kao SIGPROF. TerminacijaSIGWINCH Indikacija promene velicine prozora terminala IgnorisanjeSIGXCPU CPU izuzetak Terminacija/generise core

25

Page 26: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <signal.h>

void (*signal(int signo, void (*func)(int) ) ) (int) ;

Opis:Funkcija se koristi za registraciju funkcije za hvatanje signala.Svaki signal ima default akciju koja moze biti ignorisanje (specificira se konstantom SIG_IGN) ,terminacija (uz eventualno generisanje core fajla, koji se koristi prilikom debagovanja),stopiranje ili nastavak procesa (ako je bio stopiran). Uz to se moze predefinisati akcija koriscenjem funkcije signal. Njome se funkcija tipa void (*) (int) registruje kao “hvatac” signala, i pokrece se svaki put kada signal bude dostavljen procesu. Prilikom izvrsavanja handlera, vrsi se blokiranje samog signala koji je uhvacen.2 Akcija se moze postaviti na default koriscenjem konstante SIG_DFL. Signali SIGKILL i SIGSTOP ne mogu biti ni uhvaceni ni ignorisani, njihova default i jedina akcija je terminacija, odnosno stopiranje. Signal SIGABRT ne moze biti ignorisan, moze biti uhvacen, ali se nakon izvrsenja hvataca proces zavrsava. Funkcija signal vraca prethodni hvatac, ili SIG_ERR u slucaju greske.

#include <sys/types.h>#include <signal.h>

int kill(pid_t pid, int signo);int raise(int signo);

Opis:Funkcija kill salje procesu pid signal signo. Pri tom se signal specificira svojim imenom, a proces svojim PID-om. Funkcija vraca 0 za uspeh, -1 za gresku. Ako je pid ==0 signal se salje svim procesima u istoj procesnoj grupi za koje proces ima prava da posalje signal. Ako je pid<0 tada se signal salje svim procesima ciji je ID procesne grupe jednak apsolutnoj vrednosti argumenta pid. Proces moze da posalje signal samo procesima koji imaju isti real-user-ID, i/ili isti effective-user-ID. Superuser moze slati signale svim procesima. Signal SIGCONT se moze slati svim procesima koji pripadaju istoj sesiji.Funkcija raise se koristi za slanje signala samom sebi. Vraca 0 za OK, -1 za gresku.

#include <unistd.h>

unsigned int alarm(unsigned int seconds);int pause(void);

Opis:Funkcija alarm postavlja tajmer na seconds i vraca 0 ili broj preostalih sekundi za eventualno prethodno postavljeni tajmer. Nakon isteka tajmera se generise SIGALRM signal cija je default akcija terminacija. Ako je prethodno bio postavljen tajmer koji nije jos istekao, a parameter funkcije je 0, tada se alarm iskljucuje. Funkcija pause() se koristi za zaustavljanje procesa dok ne pristigne neki signal. Nakon toga se poziva signal handler, a nakon toga, ukoliko on vrati kontrolu programu, pause() vraca -1 i postavlja gresku na EINTR.NAPOMENA: pause() ne reaguje na signale koji su ignorisani, vec samo na one koji imaju handler, ili je akcija postavljena na terminaciju. Ona takodje ne reaguje na blokirane signale.

2 Ponasanje signal funkcije moze da bude i drugacije: na starijim sistemima signl handler se resetuje na default svaki put kada se desi signal, i ne vrsi se blokiranje samog signala u toku izvrsavanja handlera.

26

Page 27: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <signal.h>

int sigemptyset(sigset_t *set);int sigfillset(sigset_t *set);int sigaddset(sigset_t *set, int signo);int sigdelset(sigset_t *set,int signo);int sigismember(const sigset_t *set, int signo);

Opis:Funkcija sigemptyset inicijalizuje set na prazan skup, dok funkcija sigfillset inicijalizuje set na pun skup signala. Jedna od ovih inicijalizacija je obavezna da bi se set signala mogao koristiti. Funkcija sigaddset() dodaje dati signal u skup, dok funkcija sigdelset() uklanja dati signal iza skupa (signali se standardno zadaju imenom). Funkcija sigismember ispituje da li je dati signal u skupu set. Prve cetiri funkcije standardno vracaju 0 za uspeh, a -1 za gresku. Poslednja funkcija je logickog tipa: vraca 1 ako signal pripada skupu, a 0 ako ne pripada.

#include <signal.h>

int sigprocmask(int how, const sigset_t *set, sigset_t *oset);

Opis:Funkcija ocitava ili upisuje signal-masku procesa. Ovom maskom se odredjuje koji ce signali biti blokirani za taj proces. Signal maska procesa je jedan od parametara procesa koji se ne menjaju prilikom fork-exec poziva, tj. child procesi nasledjuju signal masku. Signali SIGKILL i SIGSTOP se ne mogu blokirati. Ako se to zahteva, sigprocmask precutno ignorise zahtev i ne blokira ih. Ako je oset razlicit od NULL tada se u njega upisuje takuca maska. Ako je set razlicit od NULL tada se izvrsava jedna od sledecih akcija: ako je how==SIG_BLOCK tada se skup set unira sa starom maskom i tako se kreira nova maska (tj. dodatni signali se blokiraju), ako je how==SIG_UNBLOCK tada se formira razlika stare maske i skupa set, (tj. iz skupa blokiranih signala se uklanjaju elementi skupa set), ako je how==SIG_SETMASK tada se prosto vrednost skupa set postavlja za novu masku. Vraca -1 u slucaju greske, 0 za OK.

#include <signal.h>

int sigpending(sigset_t *set);

Opis:Funkcija u set smesta sve signale koji su trenutno blokirani i cekaju da budu dostavljeni. Oni mogu biti dostavljeni ako ih odblokiramo, ili ih ignorisemo (signal funkcijom)3.Ova funkcija vraca 0 za uspeh, -1 u slucaju greske.

3 Autor je testiranjem dosao do drugacijih rezultata: i ignorisani signali se blokiraju, i takodje su u pending stanju sve dok se ne odblokiraju sigprocmask funkcijom. Autor je testove vrsio na Mandrake Linux verziji 9.0, sa kernelom 2.4.16.

27

Page 28: Sistemsko programiranje pod UNIX-ompoincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/... · 2012-11-25 · Uvod Ovaj tekst predvidjen je pre svega kao prirucnik za pripremu

#include <signal.h>int sigsuspend(const sigset_t *set);

Opis:Ova funkcija se koristi kao atomicna varijanta naredbi sigprocmask(SIG_SETMASK,&newmask,&oldmask); pause(); sigprocmask(SIG_SETMASK,&oldmask,NULL); Drugim recima, ova funkcija postavlja novu masku, zatim ceka da se desi neki signal koji ima handler, ili neki koji terminise proces. Ako se signal uhvati, onda se nakon povratka iz handlera maska postavlja na staru vrednost i nastavlja sa procesom. Funkcija u tom slucaju vraca -1. To je jedina povratna vrednost (kao i za pause).

#include <stdlib.h> void abort(void);

Opis:Ova funkcija salje pozivajucem procesu SIGABRT signal. Ovaj se signal ne moze ignorisati ali se moze postaviti handler za njega. U svakom slucaju, ako handler ne zavrsi proces tada se nakon povratka iz handlera proces zavrsava.

#include <unistd.h>unsigned int sleep(unsigned int seconds);

Opis:Funkcija suspenduje proces na zadat broj sekundi, i nastavlja ga nakon isteka vremena, ili ako u medjuvremenu nastupi signal (koji nije ignorisan ni blokiran). U prvom slucaju vraca 0, a u drugom broj preostalih sekundi.

#include <signal.h>

int sigaction (int signo, const struct sigaction *act, struct sigaction *oldact);

Opis:Funkcija predstavlja slozeniju varijantu registrovanja signal handlera. Akcija za signo se postavlja na osnovu podataka iz strukture:

struct sigaction {void (*sa_handler) (int); /* handler, SIG_DFL, ili SIG_IGN */ sigset_t sa_mask; /* dodatni signali blokirani u handleru */int sa_flags; /* dodatne opcije */

};Ukoliko je postavljen handler za signal, tada se dodatni signali specifirani maskom sa_mask blokiraju tokom izvrsavanja handlera. Nakon toga se maska vraca na vrednost pre izvrsavanja handlera. Po pravilu, sam signal se takodje implicitno blokira tokom izvrsavanja handlera. Od flagova izdvajamo:

- SA_NOCLDSTOP: Ako je signo SIGCHLD tada ne generisati signal za proces koji je stopiran.- SA_RESTART: Sistemski pozivi prekinuti ovim signalom se automatski restartuju!- SA_NODEFER: sam signal se ne blokira implicitno unutar signal handlera (nije po defaultu).- SA_RESETHAND: Signal handler se resetuje na default na ulazu u signal handler (nije po defaultu).- SA_NOCLDWAIT: Ako je signo SIGCHLD, ne prave se zombi procesi. Poziv funkcije wait()

blokira dok se svi child procesi ne zavrse, a zatim vraca -1 i errno postavlja na ECHILD. Funkcija vraca 0 za OK, -1 u slucaju greske.

28