Funkcja open() probuje otworzyc plik. Zwraca deskryptor pliku(nieujemna liczba uzywana przy czytaniu, pisaniu do pliku, itd.) lub -1 w przypadku bledu(kod bledu na zmiennej errno).
int open(const char *pathname, int flags, int mode)
Wynik - deskryptor pliku(>=0), lub -1 w przypadku bledu.Patrz kody bledow.
pathname - sciezka dostepu do pliku
flags - okresla sposob otwierania pliku
Stale uzywane jako parametr flags:
O_RDONLY,O_WRONLY,O_RDWR (otwieranie pliku odpowiednio tylko do czytania, tylko do pisania, do czytania/pisania. Flagi te mozemy modyfikowac bitowa operacja OR flagami opisanymi ponizej)
O_CREAT (jesli plik nie istnieje bedzie stworzony)
O_EXCL (uzywany z flaga O_CREAT, jesli plik juz istnieje zwroc blad)
O_NOCTTY (jesli pathname odnosi sie do terminala, to nie stanie sie on terminalem sterujacym, nawet jesli takowego proces nie posiada)
O_TRUNC (jesli plik juz istnieje obetnij go)
O_APPEND (poczatkowo oraz przed kazdym pisaniem wskaznik do pliku bedzie ustawiany na jego koncu)
O_NONBLOCK / O_NDELAY (open oraz kazda inna nastepna operacja na zwroconym deskryptorze bedzie konczyla sie bledem w przypadku koniecznosci czekania na jakies zdarzenie np. zdjecie blokady z pliku)
O_SYNC (dowolne operacje pisania na deskryptorze beda blokowaly proces az do momentu wykonania fizycznego zapisu na urzadzeniu docelowym)
Kody bledow zwracane na zmiennej errno w przypadku bledu
EEXIST (plik pathname juz istnieje - O_CREAT i O_EXCL ustawione)
EISDIR (otwierano katalog do pisania)
ETXTBSY(otwierano plik wykonwalny do pisania, ale jest on teraz wykonywany)
EFAULT (pathname wskazuje na obszar poza przestrzenia adresowa procesu)
EACCES (dostep do pliku zabroniony, lub jeden z katalogow w pathname nie zezwala na przeszukiwanie(wykonywanie))
ENAMETOOLONG(nazwa pathname za dluga)
ENOENT (katalog skladowy uzyty w sciezce nie istnieje lub jest nieprawidlowym dowiazaniem)
ENFILE (prog na maks. liczbe otwarych plikow w systemie zostal osiagniety
ENOMEM (niewystarczajaca ilosc pamieci dostepnej jadru systemu)
EROFS (plik z systemu plikow typu read-only otwierano do pisania)
ELOOP (pathname zawiera dowiazanie cykliczne tj takie, ze jego rozwiniecie nadal uzywa tego dowiazania )
ENOSPC (brak miejsca na urzadzeniu na utworzenie nowego pliku)
int open(const char *pathname, int flags, int mode)
{ file=get_empty_filp();/*file - wolna pozycja w tablicy plikow*/ mode = mode & ~umask;/* uwzglednienie umask procesu*/ Sprawdzenie praw, poprawnosci argumentow; if(flag&O_CREATE){ inode=get_empty_inode(); /* inode - wolna pozycja w tablicy i-wezlow*/ zainicjalizowanie pozycji inode w tablicy i-wezlow; }else inode=i-wezel pliku o nazwie pathname; if(flag&O_TRUNC) do_truncate(); if(plik otwarto do pisania) inode->i_writecount++; Zaincjalizowanie pozycji file w tablicy plikow; Poszukiwanie wolnej pozycji nr w tablicy deskryptorow fd procesu; fd[nr]=file; return (nr); }