include
include
include
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; // inode<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