Unix: Gestione File 1
C o rs o d i Fond a m e n ti d i I n fo rm a tica 2 C dL Ing e gn e ri a In fo rm a tica Ing . F ra n c o Z a m bon e lli
IL S IS T E M A O PE RA T IV O UN IX : G ES T IO N E F IL E IN P R OG RA MM I C PE R UN IX
Lu c id i R ea li zz a ti i n C o ll a bo ra z ion e c on :
P ro f. L e tiz ia L e on a rd i U n ive rs it à d i M od e n a
P ro f. A n ton io C o rr a d i U n ive rs it à d i B o logn a
P ro f. C esa re S te fa n e lli U n ive rs it à d i F e rr a ra
Unix: Gestione File 2
I F il e in U n ix
U n p ro c e ss o U n ix v ede tu tt o il m ondo e s te rno (I/O ) c o m e un in s ie m e d i de sc ritt o ri (da qu i d isc ende o m ogene ità tr a fil e e d is po s iti v i d i U n ix ).
I f ile de sc rip to r s ono p icc o li i n te ri non nega tiv i c he iden tif ic ano i fil e ape rti
s ta nd a rd inpu t, s ta nd a rd ou tpu t, s ta nd a rd e rr o r s ono a ss o c ia ti a i fil e de sc rip to r 0 , 1 , 2
N uo v e ope ra z ion i d i R ICH IES T A p rodu c ono nuo v i fil e de sc rip to r pe r un p ro c e ss o .
N u m e ro m a ss im o d i fd pe r p ro c e ss o e pe r s is te m a
P ro ce ss o P ro ce ss o
Tabella deidescrittorifd 0fd 1Filerete pipe
I p ro c e ss i i n te rag isc ono c on l’I/O s e c ondo il pa rad ig m a open -r ead -w rit e -c lo s e ( ope ra z ion i d i p ro logo e d i ep ilogo )
F le ss ib ili tà (po ss ib ili tà d i p ipe e rid ire z ione )
S ys te m C a ll pe r ope ra re a ba ss o liv e llo s u i fil e (
creat, open, close, read/write, lseek)
Unix: Gestione File 3
P ro logo (a p e rt u ra /c rea z ion e d i fil e ):
CR E A TE fd = cre a t (n am e, m od e) ; in t fd ; /* fil e d es cr ip to r * / in t m od e; /* att ribu ti d el fil e * /
d iri tt i d i UN IX (d i s o lit o e s p re ss i i n o tt a le ) fil
e na m e ape rto in sc ritt u ra
O P E N fd = o p en (n am e, fla g ); ch ar *n am e; in t fla g ; / * 0 le tt u ra , 1 sc ritt u ra , 2 en tr am b e * / in t fd ; /* fil e d es cr ip to r * /
ap re il fil e d i no m e n a m e c on m oda lit à fla g in /u s r/i n c lud e /f c n tl. h s ono de fin ite le c o s tan ti O _ RD O N L Y , O _ W R O N L Y , O _ RD W R , O _ APPE ND , O _ CR EA T , O _ T RUNC , O _ EX C L E s e m p i
fd=open(“file”, O_WRONLY| O_APPEND)fd=open(“file”, O_WRONLY| O_CREAT| O_APPEND, 0644)fd=open(“file”, O_WRONLY| O_CREAT| O_TRUNC, 0644)fd=open(“lock”, O_WRONLY| O_CREAT| O_EXCL, 0644)E p il ogo (c h iu s u ra d i fil e ):
C L O S E re tv al = cl o se (f d ); in t fd , re tv al;
O pe ra z ion i d i R ICH IES T A e R IL AS C IO ris o rs e (m a x nu m . f d ape rti pe r p ro c e ss o e pe r m a cc h ina )
Unix: Gestione File 4
I F IL E in UN IX
I f ile in U n ix s ono una s equen z a d i B Y T E
A CC ESS O se qu e n z ia le
I f ile s ono rapp re s en ta ti da i fil e de sc rip to r
P re s en z a d i I/O po in te r a ss o c ia to a l fil e (e a l p ro c e ss o ). I/O po in te r pun ta a lla po s iz ione c o rr en te de l fil e s u c u i il p ro c e ss o s ta ope rando (sc riv endo /leggendo )
P ro ce ss o P ro ce ss o
Tabella deidescrittorifd | I/O pointer File
Unix: Gestione File 5
F il e D esc ri p to r
In gene ra le , la le tt u ra da fd 0 ⇒ legge da s ta nd a rd inpu t la sc ritt u ra s u fd 1 ⇒ sc riv e s u s ta nd a rd ou tpu t la sc ritt u ra s u fd 2 ⇒ sc riv e s u s ta nd a rd e rr o r
Q ue s ti tr e fil e d esc ri p to r s ono ape rti au to m a tic a m en te da l s is te m a (s he ll) pe r ogn i p ro c e ss o e c o llega ti a ll'I/O
P e r p roge tt a re F ILT R I c ioè u s a re R ID IR E Z IO N E e P IP IN G
i fil tr i l eggono d ire tt a m en te da l fil e de sc rip to r 0 sc riv ono d ire tt a m en te s u l fil e de sc rip to r 1
C o m p le ta o m og e n e it à d e i fil e c on i d is po s it iv i
fd = open (" /de v /p rin te r" , O _ W R O N L Y );
A n c he pe r i d is po s iti v i u s ia m o le s te ss e p rim iti v e op e n , rea d , w ri te , c lo se
Unix: Gestione File 6
O p e ra z ion i d i L e tt u ra e S c ri tt u ra
R E AD n rea d = re a d (f d , bu f, n );
W R ITE n w rit e = w ri te (f d , bu f, n );
in t n rea d , n w rit e, n , fd ; ch ar *bu f;
• le
tt u ra e sc ri tt u ra d i un fil e a vv engono a pa rti re da lla po s iz ion e c o rr e n te de l fil e ed a v an z ano il pun ta to re (I/O po in te r) a ll'i n te rno de l fil e
• r
e s tit u isc ono : il nu m e ro d e i b y te s u c u i hanno la v o ra to -1 in c a s o d i e rr o re (c o m e tu tt e sys te m c a ll)
O gn i u ten te ha la p rop ri a v is ion e de i fil e ape rti :
N e l c a s o d i p iù u ten ti c he ap rono lo s te ss o fil e , ogn i p ro c e ss o u ten te ha un p rop rio I/O po in te r s epa ra to
SE un u ten te legge o sc riv e , m od ifi c a s o lo il p rop rio po in te r, non m od ifi c a l’I/O po in te r d i a ltr i
F IL E SYS T E M U n u ten te non ha v is ib ili tà de lle a z ion i d i un a ltr o u ten te
Unix: Gestione File 7
E se m p i d i l e tt u ra /sc ri tt u ra
C O P IA d a un F IL E a un A LT R O
#include <fcntl.h>#include <stdio.h>#define perm 0644
main (){ char f1 [20]= "file",f2 [40]= "/temp/file2";int infile, outfile; /* file descriptor */int nread;char buffer [BUFSIZ];
infile = open (f1, O_RDONLY);outfile = creat (f2, perm);
while((nread = read(infile, buffer, BUFSIZ)) > 0)
write (outfile, buffer, nread );
close(infile);close(outfile);}
L e gg e d a l fil e fil e e sc ri ve s u fil e2 in /t e m p
Unix: Gestione File 8
C op ia d a un F il e a un a lt ro (u s o a rgo m e n ti)
#define perm 0777main (argc, argv)int argc;char **argv;
{ int infile, outfile, nread;char buffer [15];
infile = open(argv[1], 0);outfile = creat(argv[2], perm);while (( nread = read(infile , buffer, 1)) > 0 ) write(outfile, buffer, 1 );
close(infile);close(outfile);}
C on R ID IR E Z IO N E
#d ef in e L UNG 1 m ai n () { ch ar bu ff er [ L UNG ]; w h il e ( re ad ( 0 , bu ff er , L UNG ) > 0 ) w rit e (1 , bu ff er , L UNG ); }
Il s is te m a e s egue i c o llega m en ti tr a fil e de sc rip to r e fil e
Unix: Gestione File 9
C op ia fil e c on c on tr o ll o d e g li e rr o ri
#include <fcntl.h>#include <stdio.h>#define perm 0744 /* tutti i diritti all'ownerlettura al gruppo ed altri */
main (argc, argv)int argc;char **argv;{ int status;int infile, outfile, nread;char buffer[BUFSIZ]; /*buffer per icaratteri*/
if (argc != 3) { printf (" errore \n"); exit (1); }
if ((infile=open(argv[1], O_RDONLY)) <0)exit(1); /* Caso di errore */
if ((outfile=creat(argv[2], perm )) <0){close (infile); exit(1); }
while((nread=read(infile, buffer, BUFSIZ)) >0 ){ if(write(outfile, buffer, nread)<nread) {close(infile);close(outfile);exit(1);} /* Caso di errore */}close(infile); close(outfile); exit(0);}
E ff ic ien z a de lle sys te m c a ll rea d e w ri te : d ipenden z a da lle d im e s ion i de l bu ff e r
Unix: Gestione File 10
E se m p io : In se ri m e n to d i ca ra tt e ri i n un fil e
#include <fcntl.h>#define perm 0744
main (argc, argv)int argc;char **argv;{ int fd;char *buff;int nr;
printf("il nome del file su cui inserirei caratteri è %s\n", argv[1]);
buff=(char *)malloc(80);/* bisogna ALLOCARE memoria per il BUFFER */
if ((fd = open(argv[1], O_WRONLY)) < 0)fd = creat(argv[1], perm);/*oppure uso di open con quali flag?*/printf("Aperto o creato con fd = %d\n", fd);
while ((nr=read(0, buff,80)) > 0)write(fd, buff, nr);
close(fd);}
Unix: Gestione File 11
L a S ta nd a rd I/ O L ib ra ry
La S tanda rd I/O lib ra ry è c o s tr u ita a l d i s op ra de lle S ys te m C a ll
E ’ una lib re ria c on tenen te fun z ion i pe r a cc ede re a i fil e a p iù a lt o li ve ll o .
In v e c e d i fil e de sc rip to r u s a s tr ea m rapp re s en ta ti da una s tr u tt u ra da ti d i tipo F IL E
s td in è uno s tr ea m a ss o c ia to a l fil e de sc rip to r s ta nd a rd inpu t s tdou t è uno s tr ea m a ss o c ia to a l fil e de sc rip to r s ta nd a rd ou tpu t s td e rr è uno s tr ea m a ss o c ia to a l fil e de sc rip to r s ta nd a rd e rr o r
F o rn isc e :
fo rm a tt a z ion e
p rin tf (" E cc o un in te ro % d \n ", c on t) bu ff e ri ng
C o s a fa la ge tc () ? m a gg io re e ff ic ie n z a
d im en s ione de i bu ff e r
S i sc on s ig lia l'u s o c on te m po raneo d i S ys te m C a ll e fun z ion i de lla S tanda rd I/O lib ra ry ne ll’ a cc e ss o a uno s te ss o fil e .
Unix: Gestione File 12
O pe ra z ion i non S equen z ia li (r ando m a cc e ss )
L S EE K n ew po s = ls ee k (f d , o ff se t, o rig in ); long in t n ew po s, o ff se t; i n t fd ; in t o rig in ; / * 0 d all 'in iz io , 1 d al co rr en te , 2 d all a fin e* /
S i s po s ta la po s iz ion e c o rr e n te ne l fil e pe r il p ro c e ss o in v o c an te .
Le s u cc e ss iv e ope ra z ion i d i l e tt u ra /sc ritt u ra a pa rti re da lla nuo v a po s iz ione
lseek(fd, 10, 2)
c o s a s u cc ede?
lseek(fd, -10, 0)
???
Unix: Gestione File 13
O pe ra z ion i s u i d is po s iti v i e fil e so lo s inc rone ci o è c on a tt es a d el co m p le ta m en to d ell 'op er a zi on e
A T O M IC IT À d e ll a S IN GO L A O PE RA Z IO N E d i l e tt u ra / sc ritt u ra e d i a z ione s u un fil e .
O p e ra z ion i p ri m it ive a z ion i e le m en ta ri e non in te rr o m p ib ili de lla m a cc h ina v irt ua le UN IX
P1 111111111 write
P2 2222222222 write file
N O N è ga ran tit a la A to m ic it à de lle s equen z e d i ope ra z ion i.
P e r e s e m p io se p iù p ro cess i m a nd a no fil e s u ll a s ta m p a n te S i po ss ono m e sc o la re le linee in v ia te a lla s ta m pan te !!!!
==> D e fin iz ione d i un g es to re de l fil e (sys te m) c he in c ap s u la la ris o rs a
Gestore File
Unix: Gestione File 14
I F il e e la m u lt i- u te n z a
O gn i u ten te ha un iden tif ic a to re de tt o u id (u s e r id ) e appa rti ene a un g ruppo g id (g roup id ), c on tenu ti ne l fil e /e tc /pa ss w d . E s e m p io :
franco:ITZ7b:230:30:F.Zambonelli:/home/franco:/bin/csh
U n p ro c e ss o a c qu is isc e u id e g id de ll’ u ten te c he lo lan c ia .
Il k e rne l m e m o rizz a pe r ogn i fil e u se r id ed g roup id de l p ro c e ss o c rea to re .
U n p ro c e ss o può a cc ede re a un fil e s e : 1 . u id p ro c e ss o == 0 2 . u id p ro c e ss o == u id p rop rie ta rio fil e e d iri tt i O K 3 . u id p ro c e ss o != u id p rop rie ta rio fil e m a g id p ro c e ss o == g id p rop rie ta rio fil e e d iri tt i O K 4 . u id e g id p ro c != u id e g id fil e , m a d iri tt i o the r O K
A tt en z ione : in rea ltà il k e rne l gua rda e ff ec tive u id e g id de l p ro c e ss o c he a cc ede a l fil e
Unix: Gestione File 15
D ir itt i d i access o a un fil e
P e r v e rif ic a re i d iri tt i d i un u te n te d i a cc ede re a un fil e :
ACC E SS re tv al = a cce ss (p at hn am e, am od e) ; ch ar * p at hn am e; in t am od e; in t re tv al;
Il pa ra m e tr o a m od e può e ss e re : 04 read a cc e ss 02 w rit e a cc e ss 01 e x e c u te a cc e ss 00 e x is ten c e
access r e s tit u isc e il v a lo re 0 in c a s o d i s u cc e ss o , a ltr im en ti -1 (e tipo d i e rr o re in e rr no )
N o ta : a cc e ss v e rif ic a i d iri tt i de ll’ u ten te , c ioè fa u s o de l rea l u id de l p ro c e ss o (non u s a e ff e c tiv e u id )
Unix: Gestione File 16
D ir itt i d i access o a un fil e
P e r c a m b ia re i d iri tt i d i un fil e : C H M O D re tv al = ch m o d (p at hn am e, n ew m od e) ; ch ar * p at hn am e; in t n ew m od e; in t re tv al;
Il pa ra m e tr o n e w m od e c on tiene i nuo v i d iri tt i ch m o d è e s egu ib ile da o w ne r o s upe ru s e r
P e r c a m b ia re il p rop rie ta rio e il g ruppo d i un fil e : C HO W N re tv al = ch o w n (p at hn am e, o w n er _ id , g roup_ id ); ch ar * p at hn am e; in t o w n er _ id ; in t g roup_ id ; in t re tv al;
ch o w n è e s egu ib ile da o w ne r o s upe ru s e r
P rob le m a : c o s a s u cc ede s e un fil e ha s e t- u s e r- id s e tt a to?
Unix: Gestione File 17
O p e ra z ion i d i L INK e UN L INK
UN L IN K re tv al = un li nk (n am e) ; ch ar *n am e; in t re tv al;
Q ue s ta p rim iti v a c on s en te d i c an c e lla re (D IS T RU GG E R E ) un fil e
In rea ltà , c o m e d ic e il s uo no m e , il s uo c o m p ito è c an c e lla re un lin k
ne l c a s o il nu m e ro d i li n k a rr iv i a Z E R O a llo ra s i ope ra an c he la D IS T RU Z IO N E de l fil e c ioè la libe ra z ione de llo s pa z io s u d isc o
L IN K re tv al = li nk (n am e1 , n am e2 ); ch ar *n am e1 , n am e2 ; in t re tv al;
Q ue s ta p rim iti v a c on s en te d i c rea re un nuo v o no m e no m e2 (un lin k ) pe r un fil e e s is ten te
v iene in c re m en ta to il nu m e ro d i li n k
P rob le m a de i d iri tt i
li n k gua rda i d iri tt i de l d ire tt o rio
T ra m ite l'u s o d i que s te due p rim iti v e v iene rea lizz a to , pe r e s e m p io , il c o m ando m v d i UN IX
Unix: Gestione File 18
E se m p io : Im p le m e n ta z ion e d e l c o m a ndo m v (ve rs ion e se m p li fica ta )
main (argc, argv)int argc;char **argv;{if (argc != 3){ printf ("Errore num arg\n"); exit(1); }/* controllo del numero di parametri */
if (link(argv[1], argv[2]) < 0){ perror ("Errore link"); exit(1);}/* controllo sulla operazione di link*/
if (unlink(argv[1]) < 0){ perror("Errore unlink"); exit(1);}/* controllo sulla operazione di unlink*/
printf ("Ok\n");exit(0);}
Unix: Gestione File 19
D ir e tt o ri
a ) C a m b io d i d ir e tt o ri o
re tv al = chd ir ( no m ed ir) ; ch ar *no m ed ir ; in t re tv al;
Q ue s ta fun z ione res tit u isce 0 s e s u ccess o ( c ioè il c a m b io d i d ire tt o rio è a vv enu to ), a ltr im en ti res tit u isce -1 (in c a s o d i in s u ccess o )
b ) A p e rt u ra d i d ir e tt o ri o
# in cl ud e < d ir en t.h >
d ir = o p end ir ( no m ed ir) ; ch ar *no m ed ir ; D IR *d ir ; /* D IR è una st ru tt u ra a st ra tt a e non u sab il e da ll 'u te n te * /
Q ue s ta fun z ione res tit u isce un v a lo re d iv e rs o da NU LL s e ha s u ccess o (c ioè l'ape rtu ra de l d ire tt o rio è a vv enu ta ), a ltr im en ti res tit u isce NU LL (in c a s o d i in s u ccess o )
c ) C h iu s u ra d ir e tt o ri o
# in cl ud e < d ir en t.h > cl o se d ir ( d ir) ; D IR *d ir ;
Q ue s ta p rim iti v a e ff e tt ua la c h iu s u ra de l d ire tt o rio
Unix: Gestione File 20
d ) L e tt u ra d ir e tt o ri o
# in cl ud e < sy s/t y p es .h > # in cl ud e < d ir en t.h >
d es cr = re a dd ir ( d ir) ; D IR *d ir ; st ru ct d ir en t *d es cr ;
La fun z ione res tit u isce un v a lo re d iv e rs o da NU LL s e ha a v u to s u ccess o (c ioè a le tt u ra de l d ire tt o rio a vv enu ta ), a ltr im en ti res tit u isce NU LL (in c a s o d i in s u ccess o ) In c a s o d i s u cc e ss o , de sc r pun ta ad una s tr u tt u ra d i tipo d iren t st ru ct d ire n t { long d_ ino ; /* i_ nu m b er * / o ff _ t d_o ff ; /* o ff se t d el p ro ss im o * / un si gn ed sho rt d_ rec le n ; /* lungh ezza d el rec o rd * / un si gn ed sho rt d_n am el en ; / * lungh ezza d el no m e * / ch ar d_n am e[ 1 ]; / * n o m e d el fil e * / }
la s tr inga c he pa rte da d es cr - > d_n am e r app re s en ta il no m e d i un fil e ne l d ire tt o rio ape rto
Q ue s ta s tr inga te rm ina c on un c a ra tt e re nu llo (c on v en z ione C )
po ss ib ili tà d i no m i c on lunghe zz a v a riab ile La lunghe zz a de l no m e è da ta da l v a lo re d i d_na m e len
Le p rim iti v e c hd ir , op e nd ir , r ea dd ir e c lo se d ir s ono
INDIPENDENTIda lla s pe c ifi c a s tr u tt u ra in te rna de l d ire tt o rio
v a lgono s ia pe r U n ix BS D c he pe r U n ix S ys te m V
Unix: Gestione File 21
e ) C rea z ion e d i un d ir e tt o ri o
M K D IR re tv al = m kd ir ( p at hn am e, m od e) ; ch ar * p at hn am e; in t m od e; / * d ir itti su l d ir ett o rio * / in t re tv al;
La p rim iti v a M K D IR c rea un d ire tt o rio c on il no m e e i d iri tt i s pe c ifi c a ti ===> v engono s e m p re c rea ti i fil e . (li n k a l d ire tt o rio c o rr en te ) .. (li n k a l d ire tt o rio pad re )
m k d ir r e s tit u isc e il v a lo re 0 in c a s o d i s u cc e ss o , a ltr im en ti un v a lo re nega tiv o
A ltr a p rim iti v a è m k nod il c u i u s o è pe rò ris e rv a to a l s upe ru s e r ( e non c rea . e .. )
Unix: Gestione File 22
E se m p io : Im p le m e n ta z ion e d e l c o m a ndo ls
#include <sys/types.h>#include <dirent.h>#include <fcntl.h>
my_dir (name)char *name; /* nome del dir */{DIR *dir; struct dirent * dd;int count = 0;
dir = opendir(name);while ((dd = readdir(dir)) != NULL){printf("Trovato file %s\n", dd-> d_name);count++;}printf("Numero totale di file %d\n", count);closedir(dir);return (0);}
main (argc, argv)int argc;char *argv[ ];{if (argc <= 1) { printf("Errore\n"); exit(1); }printf("Esecuzione di mydir\n");my_dir(argv[1]);exit(0);}
Unix: Gestione File 23
E se m p io : S i v uo le op e ra re s u un a g e ra rc h ia d i D IR E TT O R I a ll a ri ce rca d i un fil e c on no m e s p ec if ica to
P e r ESP L O R A R E la ge ra rc h ia s i u tili zz a la fun z ione pe r c a m b ia re d ire tt o rio c hd ir e le fun z ion i op e nd ir , rea dd ir e c lo se d ir
/* file dirfun.c */#define NULL 0#include <sys/types.h>#include <dirent.h>
/* La soluzione seguenteASSUME che il nome deldirettorio sia dato in modo ASSOLUTO.NOTA BENE: questa soluzione vabene se e solo seil direttorio di partenza non è la radice (/).PERCHÈ ? */
void esplora ();
main (argc, argv)int argc;char **argv;{ if (argc != 3){printf("Numero parametri non corretto\n");exit (1);} if (chdir(argv[1])!=0){perror("Errore in chdir"); exit(1);} esplora (argv[1], argv[2]);}
Unix: Gestione File 24 /* funzione di esplorazione diuna gerarchia:opera in modo RICORSIVO */void esplora (d, f)char *d, *f;{ char nd [80]; DIR *dir;struct dirent *ff; dir = opendir(d); while (((ff = readdir(dir)) != NULL)){if((strcmp (ff -> d_name, ".") == 0) || (strcmp (ff -> d_name, "..") ==0))continue;/* bisogna saltarei nomi del direttorio correntee del direttorio padre */ if (chdir(ff -> d_name) != 0) {/*è un file e non un direttorio*/if ( strcmp ( f, ff-> d_name) == 0)printf("file %s nel dir %s\n", f, d);/*eventuali altre operazioni sul file:ad esempio apertura,etc. */} else { /*abbiamo trovato un direttorio */strcpy(nd, d); strcat(nd, "/"); strcat(nd, ff-> d_name); esplora ( nd, f); chdir("..");/* bisogna tornare su di un livello */ }closedir(dir);}}
Unix: Gestione File 25
V e ri fica d e ll o s ta to d i un fil e S T A T # in cl ud e < sy s/t y p es .h > # in cl ud e < sy s/ st at .h > re tv al = st a t (p a thn a m e, & bu ff) ; ch ar * p at hn am e; st ru ct st at bu ff ; /* st ru tt u ra ch e rapp re se n ta il d es cr itt o re d el fil e * / in t re tv al;
F S T A T re tv al = fs ta t (f d , & bu ff) ; in t fd ; /* fil e d es cr ip to r * /
F S T A T può e ss e re u s a to s o lo s e il fil e è g ià ape rto
E n tr a m be le p rim iti v e rit o rnano il v a lo re 0 in c a s o d i s u cc e ss o , a ltr im en ti un v a lo re nega tiv o
V ed ia m o qua li po ss ono e ss e re i c a m p i de lla s tr u c t s ta t: st ru ct st a t { u sho rt st _ m od e; /* m odo d el fil e * / ino_ t st _ ino ; /* I_nod e nu m b er * / d ev_ t st _d ev ; /* ID d el d is po siti vo * / d ev_ t st _ rd ev ; /* so lo p er f il e sp ec ia li * / sho rt st _n li nk ; /* nu m er o d i li nk * / u sho rt st _u id ; /* U se r I D d el p rop rie ta rio * / u sho rt st _g id ; /* G roup ID d el p rop rie ta rio * / o ff _ t st _ si ze ; /* L ungh ezza d el fil e in b y te * / ti m e_ t st _ ati m e; /* te m po d ell 'u lti m o acce ss o * / ti m e_ t st _ m ti m e; /* te m po d ell 'u lti m a m od if ica * / ti m e_ t st _ cti m e; /* te m po u lti m o ca m b ia m en to d i st at o * / }
Unix: Gestione Files in C per UNIX - 26
La s tr u tt u ra d i un i- node
L ’ i- nod e è il de sc ritt o re de l fil e
S tr u tt u ra d i un i-node pe r i d is po s it iv i
nu m e ro ID en tif ic a tiv o : nu m e ro m a gg io re d riv e r d i d is po s iti v o (pe r una tabe lla d i c on figu ra z ione ) nu m e ro m ino re qua le d is po s iti v o
c lasse de l d is po s iti v o a b lo cc h i / a c a ra tt e ri
S tr u tt u ra d i un i-node pe r i fil e no rm a li/ d ir e tt o ri
- P rop ri e ta ri o u s e r id , g roup id (U ID e GI D );
- tipo de l fil e (o rd ina rio , d ire tt o rio o s pe c ia l fil e );
- p e rm ess i r ead /w rit e /e x e c u te pe r u ten te , g ruppo e a ltr i;
- i b it S U ID , S GI D , e 's ticky ';
- nu m e ro de i li n k de l fil e ;
- d im e n s ion e de l fil e
- i nd ir izz i d i tr ed ic i b lo cc h i
Unix: Gestione Files in C per UNIX - 27
R IT R O V AR E i b lo cc h i fis ic i d e l F IL E
I p rim i d ie c i i nd iri zz i d ir e tt i
L 'und ic e s im o ind iri zz o è ind ir e tt o ind ir izz o a rea c h e c on tie n e g li i nd ir izz i d i b lo cc h i
E s . c on b lo cc h i d i 512 b y te e ogn i i nd iri zz o d i 4 b y te 10 + 128 b lo cc h i
lunghe zz a fil e : 10 *512 + 128 *512 = 70656 Il dod ic e s im o du e li ve lli d i i nd ire tt e zz a : lunghe zz a m a ss im a d i fil e 10 + 128 + 128 *128 b lo cc h i Il tr ed ic e s im o t re li ve lli d i i nd ire tt e zz a fino a G b y te : 10 + 128 + 128 *128 + 128 *128 *128 b lo cc h i.
Ind ir iz zi D at a b lo ck s
01101112S i fa v o risc ono fil e d i m e d ia lungh e zz a F il e d i d im en s ion i teo ric a m en te illi m it a ta (c irc a G b y te )
Unix: Gestione Files in C per UNIX - 28
S tr u tt u ra fis ica d e l fil e sys te m
Il d isc o v iene s udd iv is o in pa rti d i d im en s ione fiss a c o m po s te d i b lo cc h i
boo t- b lo ck
" s up e rb lo ck " de sc riv e il re s to de l fil e sys te m ( d im ., s tr u tt u ra ) una lis ta de i b lo cc h i li b e ri una lis ta deg li i- nod e li b e ri
" i- li s t" lis ta deg li i- nod e
B lo cc h i d a ti
Unix: Gestione Files in C per UNIX - 29
Il D ir e tt o ri o
U n d ire tt o rio è un fil e c on una s tr u tt u ra de l tipo :
n o m e fil e i- n u m b er
no m e fil e è un no m e re la tiv o , non a ss o lu to i- nu m b e r è c o llega to in m odo un iv o c o a ll' i-node de l fil e
a ogn i fil e (o d ire tt o rio ) c on tenu to ne l d ire tt o rio , v iene a ss o c ia to l’i -nu m be r c he lo iden tif ic a un iv o c a m en te
il fil e (d ir e tt o ri o ) /h o m e/ ce sa re c o n tie n e :
file 1 1 8 9
file 2 1 3 3
miod i r 121
. 110
.. 89 /h o m e/ ce sa re /h o m e/ ce sa re
fil e1 fil e1 fil e2 fil e2 m io d ir m io d ir m io d ir
i-list
i- n od e
121121
C o s a s u cc ede ne l c a s o d i
link(“file1”, “file3”)??
Unix: Gestione Files in C per UNIX - 30
O rg a n izz a z ion e d e l F il e S ys te m UN IX
I/O pointer Spazio Utente(Processo)Spazio di sistema
i-node Tabelladei FileAttivi
Tabella dei File Aperti di Sistema fd
Tabella dei File Aperti del Processo Memoriadi Massa Dispositivi fisici
1 soloi-nodeper file
più entry per file
Tabe ll e g loba li:
U na s o la tabe lla fil e a tt iv i (i- nod e a tt iv i) c on un nu m e ro d i en tr y pa ri a l nu m e ro d i fil e a tt iv i (ape rti an c he da p iù p ro c e ss i)
U na s o la tabe lla de i fil e a p e rt i, c on una en tr y pe r ogn i ape rtu ra d i fil e (po ss ib ili p iù en tr y re fe ren ti l o s te ss o fil e ) - un pun ta to re a l c o rr is ponden te i- nod e ; - un pun ta to re (I/ 0 po in te r) pe r le ope ra z ion i d i l e tt u ra e sc ritt u ra s u l fil e : pun ta a l b y te "c o rr en te " de l fil e a pa rti re da l qua le v e rr anno e ff e tt ua te le ope ra z ion i.
Unix: Gestione Files in C per UNIX - 31
A p e rt u ra d i un fil e
L ’ape rtu ra d i un fil e (sys te m c a ll
open()) p ro v o c a :
• l’ a llo c a z ione d i un e le m en to (ind iv idua to da un fil e de sc rip to r) ne lla p rim a po s iz ione libe ra de lla T abe lla de i fil e ape rti de l p ro c e ss o
• l’i
n s e rim en to d i un nuo v o re c o rd ne lla T abe lla de i fil e ape rti d i s is te m a
• la
c op ia de l s uo i-node ne lla tabe lla de i fil e a tt iv i (s e il fil e non è g ià s ta to ape rto da un a ltr o p ro c e ss o )
Unix: Gestione Files in C per UNIX - 32
C ond iv is ion e d i fil e
a p e rt u re se p a ra te d i uno s te ss o fil e po rtano a c ond iv ide re una s o la en tr y de lla tabe lla deg li i -node a tt iv i, m a s i a v ranno d is tin te en tr y ne lla tabe lla de i fil e ape rti .
I/O pointer Spazio UtenteSpazio di sistema
i-node Tabelladei FileAttivi
Tabella dei File Apertidi Sistema fd
Tabella dei File Aperti del Processo Memoriadi Massa Dispositivi fisici
fd
I/O pointer Processo A
Processo B
Unix: Gestione Files in C per UNIX - 33
C ond iv is ion e d i fil e
C a s o d i p ro c e ss o p ro c e ss o pad re c he ap re un fil e p rim a d i c rea re un p ro c e ss o fig lio :
pad re e f ig lio c ond iv idono la en tr y ne lla tabe lla de i fil e ape rti , e an c he la c o rr is ponden te en tr y ne lla tabe lla deg li i - node a tt iv i
lo s tess o I/O po in te r;
Spazio Utente
fd
Tabella dei File Aperti del Processo fd Processo Padre
Processo Figlio
I/O pointer Spazio di sistema
i-node Tabelladei FileAttivi
Tabella dei File Aperti di Sistema Memoriadi Massa Dispositivi fisici