Gestione delle directory
Transcript
Gestione delle directory
Program m azione di Sist em a – 2a Lucidi per il corso di Laboratorio di Sistemi Operativi tenuto da Paolo Baldan presso l'Università Ca' Foscari di Venezia, anno accademico 2004/ 2005. Parte di questo materiale è rielaborato dai lucidi del Corso di Laboratorio di Sistemi Operativi tenuto da Rosario Pugliese presso l'Università di Firenze, anno accademico 2001/ 02. Gest ione File: Manipolare le inform azioni Operazioni che consent ono di accedere / m odificare le inform azioni associat e ai file Gest ire i link (hard e sim bolici) link(), unlink(), symlink() Ot t enere inform azioni su file e direct ory stat(), getdents() Cam biare propriet ario, gruppo e perm essi dei file chown(), lchown(), fchown() chmod(), fchmod() Duplicare e condividere descrit t ori dup(), dup2() Operare sui descrit t ori di file fctnl(), ioctl() 2 Gest ione dei Link Ricordiam o che in Unix le inform azioni relat ive ai file sono m em orizzat e negli i-node i-node Dat a At tributes ... Direct blocks (12) Single indirect Double indirect Triple indirect ... Dat a ... Index Dat a Dat a ... Dat a . . Index . . Index . . ... Dat a Index 3 Gest ione dei Link Per le direct ory, i blocchi dat i sono del t ipo i- n ode Nom e File i- n ode Nom e File i- n ode Nom e File ... .... ovvero cont engono una list a di nom i di file (i file cont enut i nella direct ory), e indici di i-node. Varie ent ry di direct ory possono punt are allo st esso inode, che quindi può corrispondere a vari nom i di file. Ogni i-node ha associat o un cont at ore di link (hard). L'i-node è deallocat o quando il cont at ore scende a 0 (l'inode non è più riferit o da alcun nom e). 4 Gest ione dei Link: Direct ory I link (hard) alle direct ory possono essere creat i solo dal kernel (per m ant enere una st rut t ura consist ent e). Ogni direct ory dir ha un num ero di link hard m aggiore o uguale a due com e ogni file, dir ha un link nella direct ory genit ore cont iene una ent ry “ .” che punt a a se st essa. Ogni sot t odirect ory di dir aggiunge un hard link la sot t odirect ory cont iene una ent ry “ ..” che punt a alla direct ory genit ore. 5 Creare Hard Link int link(const char *oldPath, const char *newPath) Crea un nuovo collegam ent o (hard link) newPath al file cui è già collegat o oldPath. Viene creat o una nuova direct ory ent ry newPath che condivide l'i-node di oldPath. Il cont at ore dei link hard associat o all'i-node è increm ent at o di una unit à (il suo valore può essere esam inat o t ram it e il com ando ls -l). Se newPath esist e, non viene sovrascrit t o (fallisce). Rest it uisce 0, se ha successo; -1, alt rim ent i. 6 Creare Hard Link Quando il link è creat o i l nuovo nom e può essere usat o esat t am ent e com e il vecchio per ogni operazione; ent ram bi riferiscono lo st esso i-node (e quindi hanno gli st essi perm essi e possessore) ed è im possibile dire quale fosse il nom e originale. Un file è effet t ivam ent e cancellat o dal file syst em (spazio su disco deallocat o) solo quando t ut t i i suoi link hard sono st at i rim ossi. Se newPath e oldPath risiedono su file syst em different i, non può essere creat o un hard link e link() fallisce; in quest o caso si ut ilizza symlink(). 7 Creare Link Sim bolici int symlink(const char *oldPath, const char *newPath) Crea un file speciale, det t o link sim bolico (o soft ), newPath che cont iene la st ringa oldPath. Se newPath esist e, non viene sovrascrit t o (e fallisce). Rest it uisce 0, se ha successo; -1, alt rim ent i. I link sim bolici sono int erpret at i a “ run-t im e” Se si opera sul link sim bolico con op(nome), il nucleo lo dereferenzia aut om at icam ent e ed opera sul t arget . Tut t avia, alcune operazioni (per esem pio, la rim ozione) agiscono diret t am ent e sul link sim bolico. Il link può punt are ad un file non esist ent e (Es. ln -s link nonexistent; cat link). 8 Rim uovere Hard Link int unlink(const char *fileName) Rim uove il link hard fileName all'i-node corrisp. Se fileName è l'ult im o link all'i-node, le risorse assegnat e al file vengono deallocat e. La ent ry relat iva è im m ediat . rim ossa dalla direct ory, m a se il file è apert o da qualche processo, il file viene effet t iv. deallocat o solo dopo che t ut t i i descrit t ori sono st at i chiusi. Quindi un eseguibile può effet t uare un unlink() su di un file durant e l'esecuzione ed usarlo fino al com plet am ent o. Ut ile per creare file t em poranei che spariscono alla t erm inazione del processo (anche in caso di crash). Esem pio: rim uove il file t em poraneo tmpName if (standardInput) unlink (tmpName); 9 Esem pio: unlinkTm p.c /* unlinkTmp <file> Crea un file temporaneo. Se e` stato passato l'argomento <file>, crea un link hard tra <file> ed il file creato. Cancella il file temporaneo, scrive su questo, e mostra che si puo` effettivamente ancora leggere. Se e` stato specificato <file>, al termine questo contiene quanto scritto nel file temporaneo, altrimenti il file temporaneo, con il suo contenuto spariscono */ #include #include #include #include #include #include <sys/types.h> <sys/stat.h> <fcntl.h> <stdio.h> <unistd.h> <string.h> #define MSG "Il file temporaneo esiste ancora" 10 Esem pio: unlinkTm p.c int main(int argc, char *argv[]) { int charRead, fd; char buf[100]; /* crea il file temporaneo */ fd = open("tempfile.tmp", O_RDWR | O_CREAT | O_TRUNC, 0600); if (argv[1]) /* crea un link all'eventuale argomento */ link("tempfile.tmp", argv[1]); unlink("tempfile.tmp"); /* cancella il file temporaneo */ /* scrive sul file descriptor che corrisponde al file temporaneo */ write(fd, MSG, strlen(MSG)); /* torna all'inizio del file, legge e comunica l'avvenuta lettura */ lseek(fd, SEEK_SET, 0); charRead = read(fd, buf, 100); buf[charRead]= '\0'; printf("Sono riuscito a leggere \"%s\"\n", buf); } 11 Esem pio: unlinkTm p.c $ unlinkTmp Sono riuscito a leggere "Il file temporaneo esiste ancora" $ ls tempfile.tmp ls: tempfile.tmp: no such file or directory $ unlinkTmp prova Sono riuscito a leggere "Il file temporaneo esiste ancora" $ ls tempfile.tmp prova ls: tempfile.tmp: no such file or directory 4 prova $ cat prova Il file temporaneo esiste ancora 12 Ot t enere Inform azioni sui File: st at () int stat(const char *name, struct stat *buf) int lstat(const char *name, struct stat *buf) int fstat(int fd, struct stat *buf) stat() copia in buf inform azioni sul file name. lstat() rest it uisce inform azioni sul link sim bolico name piut t ost o che sul file cui fa riferim ent o. fstat() opera com e stat(), m a ha com e argom ent o un descrit t ore di file fd anziché un nom e di file. Per usarle includere i file sys/stat.h e unistd.h. Non occorre avere dirit t o di accesso al file m a è necessario avere dirit t i di ricerca (x) su t ut t e le direct ory nel pat h del file. 13 Ot t enere Inform azioni sui File Il secondo argom ent o delle funzioni stat è un punt at ore ad una st rut t ura di inform azioni sul file specificat o struct stat { mode_t st_mode; ino_t st_ino; dev_t st_dev; dev_t st_rdev; nlink_t st_nlink; uit_t st_uid; gid_t st_gid; off_t st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; long st_blksize; long st_blocks; } // // // // // // // // // // // // // File type & mode i-node number device number (file system) device n. for special files number of links user ID of owner group ID of owner size in bytes, for reg. files time of last access time of last modif. time of last status change best I/O block size number of 512-byte blocks 14 Ricavare il t ipo di file da st _m ode Macro per det erm inare il t ipo di file File regolari S_ISREG() Direct ory file S_ISDIR() Charact er special file S_ISCHR() Device a caratt eri (es. /dev/console) Block special file S_ISBLK() File speciale a blocchi (es. /dev/fd0) FIFO S_ISFIFO() File ut ilizzat o per int erprocess com m unication (nam ed pipe) Socket S_ISSOCK() File ut ilizzat o per com unicazione di rete (e non) fra processi. Link sim bolico S_ISLNK() 15 Esem pio: filet ype.c /* filetype <fileName>+: verifica il tipo di fileName e lo segnala */ #include #include #include <sys/types.h> <sys/stat.h> <unistd.h> int main(int argc, char *argv[]) { int i; struct stat buf; char *ptr; for (i = 1; i < argc; i++) { printf("%s: ", argv[i]); if (lstat(argv[i], &buf) < 0) { perror("lstat error"); continue; } 16 Esem pio: filet ype.c /* filetype.c : continua */ if (S_ISREG(buf.st_mode)) ptr = "regular"; else if (S_ISDIR(buf.st_mode)) ptr = "directory"; else if (S_ISCHR(buf.st_mode)) ptr = "character special"; else if (S_ISBLK(buf.st_mode)) ptr = "block special"; else if (S_ISFIFO(buf.st_mode)) ptr = "fifo"; #ifdef S_ISLNK else if (S_ISLNK(buf.st_mode)) ptr = "symbolic link"; #endif else if (S_ISSOCK(buf.st_mode)) ptr = "socket"; else ptr = "** unknown mode **"; printf("%s\n", ptr); } exit(0); } 17 Esem pio: filet ype.c $ filetype /etc/passwd /etc /dev/ttya0 /dev/sda /bin/sh /etc/passwd: regular /etc: directory /dev/ttya0: character special /dev/sda: block special /bin/sh: symbolic link 18 Real e Effect ive ID Ogni processo possiede vari ID real user ID, real group ID ident ificano l’ ut ent e e il gruppo reale che esegue il proc. sono let t i dalla ent ry dell'ut ent e nel passwd file norm alm ent e non cam biano durant e la vit a di un proc. effect ive user ID, effect ive group ID, supplem ent ary group Ids id effet t ivam ent e ut ilizzat i per det erm inare i dirit t i di accesso al file syst em saved set -user-ID, saved set -group-ID cont engono copie di effect ive user id e effect ive group id; ut ilizzat i con la syst em call setuid 19 Real e Effect ive ID: Accesso ai file Modalit à di accesso ad un file: effect ive uid, effect ive gid, supplem ent ary gids sono propriet à del processo in esecuzione owner e group owner sono propriet à del file a cui si vuole accedere Algorit m o per l'accesso ad un file IF (effect ive uid = = 0)* THEN a llow e d /* 0 è l'u id d i r oot * / ELSE IF (effect ive uid = = owner) & (user perm ission) THEN a llow e d ELSE IF ({ effect ive gid} ∪ supplem ent ary gids ⊇ { group owner} ) & (group perm ission) THEN a llow e d ELSE IF (ot her perm ission) THEN a llow e d ELSE d e n ie d 20 Alt ri det t agli Per aprire un file per nom e Abbiam o bisogno dei dirit t i di esecuzione (x - search) su t ut t e le direct ory che fanno part e del nom e. At t enzione ai nom i relat ivi: current direct ory è im plicit a. Per creare un nuovo file in una direct ory Abbiam o bisogno dei dirit t i di esecuzione (x) e scrit t ura (w) sulla direct ory. Per cancellare un file in una direct ory Abbiam o bisogno dei dirit t i di esecuzione (x) e scrit t ura (w) sulla direct ory. Non abbiam o bisogno di dirit t i sul file. 21 Real e Effect ive ID: Possibile uso Norm alm ent e effect ive user id = = real user id effect ive group id = = real group id ovvero, i dirit t i di accesso sono det erm inat i dall'ut ent e che esegue il program m a Talvolt a è desiderabile un com port am ent o diverso pot rebbe esser necessario che un processo abbia (in un dat o m om ent o) dirit t i m aggiori di chi esegue il progr. Esem pio: com ando passwd Eseguit o da chiunque Deve avere la possibilit à di cam biare il file /etc/passwd 22 Real e Effect ive ID e il cam po st _m ode set -user-ID e set -group-ID se il flag set -user-ID in st_mode è at t ivo, quando il file viene eseguit o effect ive user id = = st_uid se il flag set -group-ID in st_mode è at t ivo, quando il file viene eseguit o effect ive group id = = st_gid Quest i flag risolvono il problem a di passwd l’owner del com ando passwd è root quando passwd viene eseguit o, il suo effect ive user id è uguale a root il com ando può accedere in scrit t ura al file /etc/passwd 23 Cost ant i per accedere st _m ode Cost ant i per accedere ai dirit t i di let t ura e scrit t ura cont enut i in st_mode S_ISUID S_ISGID S_IRUSR S_IWUSR S_IXUSR S_IRGRP S_IWGRP S_IXGRP S_IROTH S_IWOTH S_IXOTH set -user-ID set -group-ID accesso in let t ura, owner accesso in scrit t ura, owner accesso in esecuzione, owner accesso in let t ura, gruppo accesso in scrit t ura, gruppo accesso in esecuzione, gruppo accesso in let t ura, alt ri accesso in scrit t ura, alt ri accesso in esecuzione, alt ri 24 Ot t enere Inform azioni sulle Direct ory int getdents(int fd, struct dirent *buf, int structSize) Legge un cert o num ero di st rut t ure del t ipo struct dirent dal file della direct ory riferit a da fd e le m em orizza nell'area di m em oria punt at a da buf. structSize è la grandezza dell'area di m em oria. Rest it uisce il num ero di byt e let t i, se ha successo; 0 quando l'ult im a ent ry è già st at a let t a; -1 in caso di errore. 25 Ot t enere Inform azioni sulle Direct ory La st rut t ura dirent definit a in sys/dirent.h cont iene inform azioni su una ent ry della direct ory. Ha la seguent e st rut t ura struct dirent { long d_ino; off_t d_off; unsigned short d_reclen; char d_name [NAME_MAX+1]; } /* /* /* /* numero di offset di lunghezza nome file inode */ questa dirent */ effettiva di d_name */ (null-terminated) */ 26 Ot t enere Inform azioni sulle Direct ory La syst em call getdents è obsolet a e non sem pre disponibile. Alt ernat ivam ent e... DIR *opendir(const char *pathname); Apre una direct ory; rit orna un punt at ore se t ut t o è ok, NULL in caso di errore struct dirent *readdir(DIR *dp); Rit orna un punt at ore ad una st rut t ura dat i cont enent e inform azioni sulla prossim a ent ry, NULL se fine della direct ory o errore void rewinddir(DIR *dp); Rit orna all'inizio della direct ory void closedir(DIR *dp); Chiude la direct ory 27 Esem pio: list Dirs.c /* listDirs {dirName}*: elenca i file nelle directory date come argomento, o della cwd, se non viene passato alcun argomento */ #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> /* elenca tutti i file della directory dirName */ void listDir (char *dirName) { DIR *fdir; struct dirent *myentry; fdir = opendir(dirName); /* apre la directory */ if (fdir == NULL) { perror("listDirs"); exit(-1); } 28 Esem pio: list Dirs.c printf("Directory: %s\n", dirName); /* elenca tutti i file della directory */ while ((myentry = readdir(fdir)) != NULL) printf(" %s\n", myentry->d_name); closedir(fdir); } int main (int argc, char *argv[]) { if (argc == 1) listDir("."); else { int i; for (i=1; i<argc; i++) listDir(argv[i]); } } 29 Sull'accesso alle direct ory Le direct ory possono essere let t e da chiunque abbia accesso in let t ura Il form at o del file speciale direct ory dipende dalla im plem ent azione di Unix Per quest o m ot ivo, esist ono delle funzioni ad hoc per leggere il cont enut o di una direct ory Solo il kernel può scrivere in una direct ory Per evit are problem i di consist enza I dirit t i di scrit t ura specificano la possibilit à di ut ilizzare uno dei seguent i com andi creat, unlink, remove, symlink, mkdir, rmdir 30 Cam biare il propriet ario di un file int chown(const char *name, uid_t ownerId, gid_t groupId) int lchown(const char *name, uid_t ownerId, gid_t groupId) int fchown(int fd, uid_t ownerId, gid_t groupId) chown() m odifica gli ID del possessore e del gruppo del file name in ownerId e groupId, rispet t ivam ent e. Un valore -1 in un argom ent o, significa che il valore associat o deve rest are inalt erat o. lchown() m odifica possessore e gruppo del link sim bolico nam e, piut t ost o che quelli relat ivi al file a cui il link fa riferim ent o. fchown() opera com e chown() m a prende com e argom ent o un descrit t ore di file apert o. 31 Cam biare il propriet ario di un file Solo un superut ent e può m odificare il possessore di un file; un ut ent e può m odificare il gruppo in un alt ro a cui l'ut ent e appart iene. 32 Cam biare i perm essi di un file int chmod(const char *name, int mode) int fchmod(int fd, int mode) chmod() m odifica i perm essi sul file name in mode. mode di solit o è una st ringa di cifre ot t ali. Solo il possessore del file o un superut ent e può m odificare i perm essi sul file. fchmod() opera com e chmod() m a ha com e argom ent o un descrit t ore di file apert o anziché il nom e di un file. 33 Duplicare i descrit t ori di file Le syst em call dup() e dup2() perm et t ono di duplicare un file descript or p r oce ss t a b le op e n f ile t a b le pt r 1 1 fd Creano un (nuovo) file descript or che punt a alla st essa ent ry della open file t able newfd=dup(fd) dup2(fd,newfd) p r oce ss t a b le op e n f ile t a b le pt r 1 n ew fd fd 2 34 Duplicare i descrit t ori di file int dup(int oldFd) int dup2(int oldFd, int newFd) dup() t rova il più piccolo descrit t ore non ut ilizzat o e lo fa riferire alla st essa file descript or ent ry (nella t abella dei file apert i) a cui fa riferim ent o oldFd. dup2() il secondo argom ent o newFd è il nuovo descrit t ore. Se newFd è at t ualm ent e at t ivo, lo chiude e lo fa poi riferire allo st esso file a cui fa riferim ent o oldFd. Not a: il descrit t ore di file originale e quello copiat o condividono lo st esso punt at ore int erno al file e le st esse m odalit à di accesso. Rit ornano il nuovo descrit t ore, se hanno successo; e -1 alt rim ent i. 35 Duplicare i descrit t ori di file: Esem pio /* Il programma mydup.c */ #include <stdio.h> #include <fcntl.h> int main (void) { int fd1, fd2, fd3; fd1 = open ("test.txt", O_CREAT | O_RDWR, 0600); printf ("fd1 = %d\n", fd1); write (fd1, "what's", 6); fd2 = dup (fd1); /* Make a copy of fd1 */ printf ("fd2 = %d\n", fd2); write (fd2, " up", 3); close (0); /* Close standard input */ fd3 = dup (fd1); /* Make another copy of fd1 */ printf ("fd3 = %d\n", fd3); write (0, " doc", 4); dup2 (3, 2); /* Duplicate channel 3 to channel 2 */ write (2, "?\n", 2); return 0; } 36 Ridirezione: Esem pio /* programma redirectOut.c */ /* redirectOut.c cmd out: esegue il comando cmd, ridirigendo l'output sul file out */ #include <stdio.h> #include <fcntl.h> int main (void) { int fd; fd = open (argv[2], O_CREAT | O_RDWR, 0600); dup2 (fd,1); /* Stdin becomes a copy of fd */ execlp(argv[1],argv[1],NULL); return 0; } 37 Duplicare i descrit t ori di file: Esem pio produ ce il segu en te ou tpu t $ mydup fd1 = 3 fd2 = 4 fd3 = 0 $ cat test.txt what's up doc? $ 38 Operare sui descrit t ori di file int fcntl(int fd, int cmd [, int arg]) Esegue l'operazione cmd sul file associat o al descrit t ore fd. Il param . opzionale arg è un argom ent o per cmd. I valori più com uni per cmd sono F_SETFD: assegna il bit m eno significat ivo di arg al flag close-on-exec. F_GETFD: rest it uisce un num ero il cui bit m eno signific. è 1 o 0 a seconda che il flag close-on-exec sia at t ivo o no. F_GETFL: rest it uisce un num ero che corrisponde ai flag corrent i del file ed ai m odi di accesso. F_SETFL: pone ad arg i flag dello st at o del file. 39 Operare sui descrit t ori di file F_GETOWN: rest it uisce l'ident ificat ore del processo o il gruppo di processo che è al m om ent o dest inat o a ricevere i segnali SIGIO/SIGURG. Se il valore è posit ivo si riferisce all'ID di un processo. Se è negat ivo, il suo valore assolut o si riferisce a un gruppo di processo. F_SETOWN: pone ad arg l'ident ificat ore del processo o il gruppo di processo che dovrebbe ricevere i segnali SIGIO/SIGURG (vale quant o det t o per F_GETOWN). 40 Cont rollare i disposit ivi int ioctl(int fd, int cmd, int arg) Esegue l'operazione cmd sul file associat o al descrit t ore fd. Il param . opzionale arg è un argom ent o per cmd. I valori validi per cmd dipendono dal disposit ivo a cui fd fa riferim ent o e sono t ipicam ent e docum ent at i nel m anuale d'ist ruzioni del disposit ivo. 41