Interfejs UNIX sistema 2 Procesi UNIX sprecifikacija u

  • Slides: 35
Download presentation
Interfejs UNIX sistema (2)

Interfejs UNIX sistema (2)

Procesi UNIX sprecifikacija u verziji 2 definiše proces kao adresni prostor u kojem se

Procesi UNIX sprecifikacija u verziji 2 definiše proces kao adresni prostor u kojem se izvršavaju jedna ili više niti, zajedno sa sistemskim resursima potrebnim za njihovo izvršavanje UNIX omogućava da se više programa izvršava istovremeno Instanca programa u izvršavanju je proces

Procesi Svaki proces ima jedinstveni pid Svaki proces ima roditeljski proces sa ppid (osim

Procesi Svaki proces ima jedinstveni pid Svaki proces ima roditeljski proces sa ppid (osim init proces) Za rad sa procesima koristi se tip pid_t definisan u <sys/types. h> Sistemski poziv getpid() vraća pid Sistemski poziv getppid() vraća pid roditeljskog procesa Pozivi su iz <unistd. h>

Procesi

Procesi

Kreiranje procesa, system Funkcija system iz standardne C biblioteke Rezultat je isti kao da

Kreiranje procesa, system Funkcija system iz standardne C biblioteke Rezultat je isti kao da je komanda izvršena u shellu Funkcija vraća 127 ako ne može da pokrene shell -1 u slučaju neke druge greške Izlazni status shell komande

Kreiranje procesa, system

Kreiranje procesa, system

Kreiranje procesa, fork kreira proces dijete koji je kopija roditeljskog procesa exec familija čini

Kreiranje procesa, fork kreira proces dijete koji je kopija roditeljskog procesa exec familija čini da određeni proces prestane da bude instanca nekog programa i postane instanca drugog programa #include <unistd. h>

Kreiranje procesa - fork Povratna vrijednost za roditeljski proces je pid procesa djeteta Povratna

Kreiranje procesa - fork Povratna vrijednost za roditeljski proces je pid procesa djeteta Povratna vrijednost za proces dijete je 0 Primjer: napisati program koji koristeći fork duplira proces

Kreiranje procesa, fork

Kreiranje procesa, fork

Sistemski poziv wait #include <sys/types. h>; #include <sys/wait. h> pid_t wait(int *stat_loc); Proces roditelj

Sistemski poziv wait #include <sys/types. h>; #include <sys/wait. h> pid_t wait(int *stat_loc); Proces roditelj se blokira dok neki od procesa djece ne završi Povratna vrijednost pid za proces dijete preko int pokazivača daje statusne informacije za proces dijete

Sistemski poziv wait Statusna informacija se interpretira pomoću macro -a definisanih u <sys/wait. h>

Sistemski poziv wait Statusna informacija se interpretira pomoću macro -a definisanih u <sys/wait. h> WIFEXITED(stat_val) vraća ne-nula ako je proces dijete završio bez greške. WEXITSTATUS(stat_val) ako je WIFEXITED različito od 0, vraća izlazni kod za proces dijete. .

Sistemski poziv, wait

Sistemski poziv, wait

Sistemski poziv, wait

Sistemski poziv, wait

Kreiranje procesa - familija exec Kada program pozove exec, proces prestaje sa izvršavanjem tog

Kreiranje procesa - familija exec Kada program pozove exec, proces prestaje sa izvršavanjem tog programa i započinje izvršavanje nekog drugog

Kreiranje procesa – familija exec int execl(const char *path, const char *arg, . .

Kreiranje procesa – familija exec int execl(const char *path, const char *arg, . . . ); int execlp(const char *file, const char *arg, . . . ); int execle(const char *path, const char *arg, . . . , char * const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]);

Kreiranje procesa - familija exec

Kreiranje procesa - familija exec

Kreiranje procesa - familija exec

Kreiranje procesa - familija exec

Međuprocesna komunikacija Oznaka za PIPE u shell-u je | Podaci se čitaju iz PIPE-a

Međuprocesna komunikacija Oznaka za PIPE u shell-u je | Podaci se čitaju iz PIPE-a u redosledu upisivanja Kreiranje PIPE-a int pipe_fds[2], read_fd, write_fd; pipe(pipe_fds); read_fd = pipe_fds[0]; write_fd = pipe_fds[1]; Podaci upisani u write_fd mogu da se pročitaju iz read_fd Fajl deskriptori koje vrati pipe validni su samo za određeni procese djecu

Međuprocesna komunikacija

Međuprocesna komunikacija

Međuprocesna komunikacija, exec

Međuprocesna komunikacija, exec

Međuprocesna komunikacija, exec

Međuprocesna komunikacija, exec

Međuprocesna komunikacija, exec

Međuprocesna komunikacija, exec

Međuprocesna komunikacija Dijeljena memorija omogućava da dva nepovezana procesa pristupaju logički istoj memoriji Veoma

Međuprocesna komunikacija Dijeljena memorija omogućava da dva nepovezana procesa pristupaju logički istoj memoriji Veoma efikasan način Dijeljena memorija je dio adresnog prostora procesa koji je kreira, ostali procesi moraju da je pridruže svom adresnom prostoru kako bi joj pristupili Nema sinhronizacije

Dijeljena memorija

Dijeljena memorija

Međuprocesna komunikacija Funkcije za rad sa dijeljenom memorijom #include<sys/shm. h> #include<sys/ipc. h> #include<sys/types. h>

Međuprocesna komunikacija Funkcije za rad sa dijeljenom memorijom #include<sys/shm. h> #include<sys/ipc. h> #include<sys/types. h> void *shmat(int shm_id, const void *shm_addr, int shmflg); int shmctl(int shm_id, int cmd, struct shmid_ds *buf); int shmdt(const void *shm_addr); int shmget(key_t key, size_t size, int shmflg);

Međuprocesna komunikacija shmget – proces alocira dijeljenu memoriju Prvi argument je cjelobrojni ključ koji

Međuprocesna komunikacija shmget – proces alocira dijeljenu memoriju Prvi argument je cjelobrojni ključ koji idenifikuje segment dijeljene memorije; sa ovim ključem ostali procesi mogu da pristupe memoriji; Drugi argument specifikuje veličinu memorije u bajtima Treći argument su flegovi IPC_CREAT S_IRUSR, S_IWUSR, S_IRGRP, S_IWGRP, S_IROTH. . . U slučaju greške vraća -1, inače identifikator segmenta

Međuprocesna komunikacija shmat – SHered Memory ATtach Argumenti shm_id je identifikator vraćen iz shmget

Međuprocesna komunikacija shmat – SHered Memory ATtach Argumenti shm_id je identifikator vraćen iz shmget shm_addr je adresa u adresnom prostoru na koju se mapira dijeljena memorija, ako je NULL Linux sam određuje ovu adresu shmflg su flegovi SHM_RND SHM_RDONLY U slučaju greške vraća -1, inače pokazivač na prvi bajt dijeljene memorije

Međuprocesna komunikacija shmdt prekida vezu procesa i dijeljene memorije Argument je pokazivač vraćen iz

Međuprocesna komunikacija shmdt prekida vezu procesa i dijeljene memorije Argument je pokazivač vraćen iz shmat U slučaju uspjeha vraća 0, inače -1

Međuprocesna komunikacija shmctl vraća informacije o dijeljenoj memoriji i može da je mijenja Argumenti

Međuprocesna komunikacija shmctl vraća informacije o dijeljenoj memoriji i može da je mijenja Argumenti Identifikator dijeljene memorije Za brisanje segmenta drugi argument je IPC_RMID i treći je NULL Segment se briše kada svaki proces koji je pridružio segment raskine vezu sa njim

Dijeljena memorija

Dijeljena memorija

Sistemski poziv access #include <unistd. h> Testira prava pristupa Dva argumenta Ime fajla Flagovi

Sistemski poziv access #include <unistd. h> Testira prava pristupa Dva argumenta Ime fajla Flagovi R_OK, W_OK, X_OK, F_OK Povratna vrijednost 0 ako proces ima dozvole -1 inače

Sistemski poziv access

Sistemski poziv access

Sistemski poziv fcntl #include <fcntl. h>; #include<unistd. h>; int fcntl(int fildes, int command, struct

Sistemski poziv fcntl #include <fcntl. h>; #include<unistd. h>; int fcntl(int fildes, int command, struct flock *flock_structure); Najvažnija funkcija je zaključavanje fajlova Argumenti Fajl deskriptor Vrijednost koja određuje koja se operacija izvodi, za zaključavanje je F_SETLKW Pokazivač na struct flock, polje l_type može da bude F_RDLCK ili F_WRLCK ili F_UNLCK

Sistemski poziv fcntl

Sistemski poziv fcntl

Sistemski poziv fcntl

Sistemski poziv fcntl