20.07.2013 Views

include

include

include

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Programiranje za UNIX<br />

Datoteke i direktoriji


Sadržaj<br />

Svojstva UNIX datoteka<br />

Korisnici i prava<br />

Operacije sa linkovima<br />

Rad s direktorijima<br />

Sistemske datoteke<br />

Sistemske informacije<br />

2


Svojstva datoteke<br />

Svojstva datoteke (file attributes)<br />

dokhvaćaju se korištenjem stat<br />

sistemskih poziva:<br />

stat – vraća strukturu sa<br />

datotečnim atributima za danu<br />

datoteku (poziva se sa imenom<br />

datoteke)<br />

fstat – vraća strukturu sa<br />

datotečnim atributima za datoteku<br />

otvorenu na file descriptoru<br />

lstat – vraća informacije o<br />

simboličkom linku, ne o datoteci na<br />

koju link pokazuje<br />

3


stat sistemski pozivi<br />

#<strong>include</strong> <br />

#<strong>include</strong> <br />

#<strong>include</strong> <br />

int stat(const char *path, struct stat *buf);<br />

int fstat(int fd, struct stat *buf);<br />

int lstat(const char *path, struct stat *buf);<br />

Vraća 0, -1 u slučaju greške<br />

Sve navedene funkcije kao drugi<br />

argument koriste pokazivač na<br />

strukturu struct stat<br />

4


struct stat {<br />

mode_t st_mode; // tip i mod (prava pristupa)<br />

ino_t st_ino; // i­node<br />

dev_t st_dev; // device number<br />

dev_t st_rdev; // device number za spec. dat.<br />

nlink_t st_nlink; // broj linkova<br />

uid_t st_uid; // user ID vlasnika<br />

gid_t st_gid; // group ID vlasnika<br />

off_t st_size; // velicina (za reg. datoteke)<br />

time_t st_atime; // zadnji pristup datoteci<br />

time_t st_mtime; // zadnja izmjena<br />

time_t st_ctime; // zadnja promjena statusa<br />

blksize_t st_blksize; // optimalna velicina IO bloka<br />

blkcnt_t st_blocks; // broj alociranih blokova<br />

};


Tipovi datoteka<br />

UNIX podržava sljedeće tipove<br />

datoteka:<br />

Regularna datoteka<br />

Direktorij – sadrži imena datoteka<br />

Blok specijalna datoteka – baferirani<br />

pristup uređajima sa fiksnom veličinom<br />

bloka podataka<br />

Karakter specijalne datoteka –<br />

nebaferirani pristup sa varijabilnom<br />

veličinom jedinice prijenosa<br />

FIFO – komunikacija među procesima<br />

Socket – lokalna i komunikacija putem<br />

mreže<br />

Simbolički link – sadrži ime druge<br />

datoteke<br />

6


Dohvatanje tipa datoteke<br />

Enkodirano u st_mode članu stat<br />

strukture<br />

Otkriva se korištenjem makro<br />

funkcija:<br />

S_ISREG - regularna datoteka<br />

S_ISDIR - direktorij<br />

S_ISBLK - blok specijalna datoteka<br />

S_ISCHR - karakter specijalna datoteka<br />

S_ISFIFO - FIFO<br />

S_ISLNK - simbolički link<br />

S_ISSOCK - socket<br />

7


Korisnici i procesi<br />

Svaki proces ima 6 ili više<br />

identifikacijskih brojeva koji su s njim<br />

povezani<br />

Stvarni vlasnik procesa:<br />

real user ID<br />

Real group ID<br />

Efektivno vlasništvo, zamjenske grupe<br />

Effective user ID<br />

Effective group ID<br />

Supplementary group IDs<br />

Saved by exec<br />

Saved set-user-ID<br />

Saved set-group-ID<br />

8


Efektivni user i group ID<br />

Kod pokretanja programa sistemskim<br />

pozivom exec, UID i GID se ne mijenjaju<br />

(uzimaju se od korisnika koji program<br />

pokreće)<br />

Što ako je određenom procesu<br />

potrebno dati prava koja korisnik<br />

uobičajeno nema?<br />

Npr. Promjena lozinke zahtjeva pisanje<br />

u /etc/shadow datoteku<br />

Postoji mogućnost uključivanja zastavice<br />

(bita) u st_mode članu:<br />

Kada je ovaj bit uključen, efektivni<br />

vlasnik procesa postaje vlasnik datoteke<br />

(isto vrijedi i za efektivni GID)<br />

9


access provjera prava<br />

#<strong>include</strong> <br />

int access(const char *pathname, int mode);<br />

Vraća 0, -1 ukoliko najmanje jedan bit u mode nije<br />

dopušten u pravima pristupa za danu datoteku, ili je došlo<br />

do druge greške<br />

Provjerava stvarna prava pristupa za datoteku (real<br />

UID & GID)<br />

Provjeravaju se prava zadana u argumentu mode<br />

R_OK - pravo čitanja<br />

W_OK - pravo pisanja<br />

X_OK - pravo izvršavanja<br />

F_OK - provjerava se postojanje datoteke<br />

10


Prava pristupa - st_mode<br />

9 bitova označavaju prava pristupa :<br />

S_IRUSR - user-read<br />

S_IWUSR - user-write<br />

S_IXUSR - user-execute<br />

S_IRGRP - group-read<br />

S_IWGRP - group-write<br />

S_IXGRP - group-execute<br />

S_IROTH - other-read<br />

S_IWOTH - other-write<br />

S_IXOTH - other-execute<br />

Testiranje setUID I setGID prava:<br />

S_ISUID, S_ISGID<br />

11


umask maska procesa<br />

#<strong>include</strong> <br />

mode_t umask(mode_t cmask);<br />

Vraća prethodnu vrijednost maske za proces<br />

cmask – dobija se kombiniranjem konstanti<br />

S_IRUSR, S_IWUSR, …<br />

Maska se koristi svaki put kod kreiranja nove<br />

datoteke (open, creat)<br />

Prava uključena u maski procesa<br />

isključena su u pravima pristupa za<br />

datoteku!!!<br />

12


Promjena prava pristupa<br />

Sistemski pozivi chmod, fchmod:<br />

#<strong>include</strong> <br />

int chmod(const char *path, mode_t mode);<br />

int fchmod(int fd, mode_t mode);<br />

Obje funkcije vraćaju 0, -1 u slučaju greške<br />

Za promjenu prava pristupa mora biti<br />

zadovoljen jedan od 2 uvjeta:<br />

Efektivni UID procesa mora biti isti kao ID<br />

vlasnika datoteke<br />

Proces mora imati ovlasti superusera<br />

(root)<br />

13


Promjena vlasništva<br />

#<strong>include</strong> <br />

int chown(const char *pathname, uid_t owner, \<br />

gid_t group);<br />

int fchown(int fd, uid_t owner, gid_t group);<br />

int lchown(const char *pathname, uid_t owner, \<br />

gid_t group);<br />

Sve funkcije vraćaju 0, -1 u slučaju greške<br />

chown i lchown se pozivaju sa imenom datoteke,<br />

fchown se koristi za datoteku otvorenu na file<br />

deskriptoru<br />

lchown mijenja vlasnika za simbolički link, ne na<br />

datoteci na koju link pokazuje<br />

Proces mora imati ovlasti superusera (root)!<br />

14


Čvrsti linkovi (hard link)<br />

"Različita" imena iste datoteke (u<br />

istom ili različitim direktorijima)<br />

Svi hard linkovi na datoteku moraju<br />

biti u istom datotečnom sustavu (na<br />

istom disku/particiji)<br />

Samo superuser može naprviti link<br />

na direktorij<br />

Brisanjem datoteke (rm dat_ime)<br />

briše se hard link na datoteku<br />

(directory entry)<br />

Kada link count padne na 0<br />

(brisanjem zadnjeg linka) briše se i<br />

datoteka sa diska<br />

15


disk<br />

UNIX datotečni sustav<br />

filesystem<br />

boot block(s)<br />

super block<br />

partition<br />

partition partition<br />

i-list directory blocks and data blocks<br />

i-node i-node ... i-node<br />

16


UNIX datotečni sustav<br />

i-node je zapis fiksne dužine koji sadrži informacije o datoteci<br />

i-list<br />

data block data block directory block data block directory block<br />

1. data block<br />

2. data block<br />

i-node i-node i-node i-node<br />

Dvije datoteke u dva različita<br />

Direktorija<br />

pokazuju na isti i-node<br />

directory and data blocks<br />

3. data block<br />

i-node<br />

number filename<br />

i-node<br />

number filename<br />

17


Link na postojeću datoteku<br />

Stvaranjem linka na postojeću<br />

datoteku stvara se novi zapis u<br />

direktoriju (directory entry)<br />

#<strong>include</strong> <br />

int link(const char *oldpath, \<br />

const char *newpath);<br />

int unlink(const char *pathname);<br />

Obje funkcije vraćaju 0, -1 u slučaju greške<br />

Stvaranje linka i povećanje<br />

st_nlink člana stat strukture je<br />

atomska operacija<br />

18


Simbolički linkovi<br />

Simbolički link sadrži ime (putanju) na<br />

datoteku na koju pokazuje<br />

Simbolički linkovi mogu pokazivati na<br />

datoteke na drugim datotečnim sustavima<br />

U trenutku kreiranja simboličkog linka ne<br />

mora postojati datoteka na koju link pokazuje<br />

Brisanjem datoteke ne brišu se i linkovi koji<br />

na nju pokazuju<br />

#<strong>include</strong> <br />

int symlink(const char *actualpath, \<br />

const char *sympath);<br />

Vraća 0, -1 u slučaju greške<br />

19


eadlink funkcija<br />

Funkcija open otvara datoteku na koju<br />

simbolički link pokazuje<br />

readlink:<br />

otvara link (ne datoteku na koju pokazuje)<br />

Učitava putanju na datoteku (kako je<br />

zapisana u linku) u bufer<br />

#<strong>include</strong> <br />

ssize_t readlink(const char *path, \<br />

char *buf, size_t bufsize);<br />

Vraća broj byteova učitanih u buf (dužinu imena datoteke),<br />

-1 u slučaju greške<br />

20


Vremena pristupa za datoteku<br />

Za svaku datoteku čuvaju se tri<br />

vremena:<br />

st_atime – zadnji pristup sadržaju<br />

datoteke<br />

npr. čitanje datoteke<br />

st_mtime – zadnja izmjena datoteke<br />

npr. pisanje u datoteku<br />

st_ctime – zadnja izmjena statusa<br />

datoteke<br />

Prava pristupa<br />

Promjena UID, GID<br />

Promjena broja linkova<br />

...<br />

21


Promjena vremena<br />

Funkcija utime mijenja vrijeme zadnjeg<br />

pristupa i promjene sadržaja<br />

#<strong>include</strong> <br />

#<strong>include</strong> <br />

int utime(const char *pathname, \<br />

const struct utimbuf *times);<br />

struct utimbuf {<br />

time_t actime; // vrijeme pristupa<br />

time_t modtime; // vrijeme promjene<br />

};<br />

Vraća broj byteova učitanih u buf (dužinu imena datoteke),<br />

-1 u slučaju greške<br />

22


Upravljanje direktorijima<br />

#<strong>include</strong> <br />

int mkdir(const char *pathname, mode_t mode);<br />

Vraća 0, -1 u slučaju greške. U direktoriju se automatski<br />

kreiraju datoteke . i ..<br />

#<strong>include</strong> <br />

int rmdir(const char *pathname);<br />

Vraća 0, -1 u slučaju greške. Direktorij koji se briše mora<br />

biti prazan.<br />

23


Čitanje direktorija<br />

#<strong>include</strong> <br />

DIR *opendir(const char *pathname);<br />

struct dirent *readdir(DIR *dp);<br />

void rewinddir(DIR *dp);<br />

int closedir(DIR *dp);<br />

long telldir(DIR *dp);<br />

long seekdir(DIR *dp, long loc);<br />

struct dirent {<br />

ino_t d_ino;<br />

char d_name[NAME_MAX+1];<br />

}<br />

Samo kernel ima mogućnost pisanja u<br />

direktorij!<br />

24


Radni direktorij<br />

Home direktoij je svojstvo korisnika<br />

Trenutni radni direktorij (CWD) je<br />

svojstvo procesa<br />

Upravljanje radnim direktorijem:<br />

#<strong>include</strong> <br />

char *getcwd(char *buf, size_t size);<br />

Vraća trenutni radni direktorij, NULL pokazivač u slučaju<br />

greške<br />

int chdir(const char *pathname);<br />

int fchdir(int filedes);<br />

Vraćaju 0, -1 u slučaju greške<br />

25

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!