Funkcje stat, lstat i fstat zwracają informacje o podanym pliku. Do

Transkrypt

Funkcje stat, lstat i fstat zwracają informacje o podanym pliku. Do
Funkcje stat, lstat i fstat zwracają informacje o podanym pliku. Do uzyskania tej informacji nie
są wymagane prawa dostępu do samego pliku, lecz -- w przypadku stat() i lstat() -- konieczne są
prawa wykonywania (przeszukiwania) do wszystkich katalogów na prowadzącej do pliku ścieżce
path.
• stat() zwraca status pliku wskazywanego przez path, ładując go do argumentu buf.
• lstat() jest identyczny z stat(), lecz w przypadku gdy path jest dowiązaniem symbolicznym, to
zwraca status tego dowiązania, a nie pliku, do którego się to dowiązanie odwołuje.
• fstat() jest identyczny z stat(), z tym wyjątkiem, że plik, którego status ma zwrócić, jest
określony przez deskryptor pliku fd.
Funkcje stat, fstat i lstat zwracają strukturę stat, zawierającą następujące pola:
struct stat {
dev_t st_dev;
/* ID urządzenia zawierającego plik */
ino_t st_ino;
/* numer i-węzła (inode) */
umode_t st_mode;
/* ochrona */
nlink_t st_nlink;
/* liczba dowiązań stałych (hardlinks) */
uid_t st_uid;
/* ID użytkownika właściciela */
gid_t st_gid;
/* ID grupy właściciela */
dev_t st_rdev;
/* ID urządzenia (jeśli plik specjalny) */
off_t st_size;
/* całkowity rozmiar w bajtach */
blksize_t st_blksize;
/* wielkość bloku dla I/O systemu plików */
blkcnt_t st_blocks;
/* liczba zaalokowanych bloków 512-bajtowych */
time_t st_atime;
/* czas ostatniego dostępu */
time_t st_mtime;
/* czas ostatniej modyfikacji */
time_t st_ctime;
/* czas ostatniej zmiany */
};
Po więcej informacji odsyłam do manuala.
Manipulacje na deskryptorach plików realizowane są za pomocą fnctl.
SKŁADNIA
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
OPIS
fcntl dokonuje jednej z wielu różnych operacji na fd. Wykonywana operacja zdeterminowana
jest przez cmd.
Obsługa zamknięcia przy uruchomieniu (close-on-exec)
F_DUPFD
Znalezienie najniższego dostępnego numeru dla deskryptora pliku, wiekszego lub równego
arg i uczynienie deskryptora o tym numerze kopią fd. Jest to inna postać dup2(2),
korzystająca z konkretnego, zadanego deskryptora.
Stare i nowe deskryptory mogą być używane zamiennie. Dzielą one blokady, wskaźniki
pozycji pliku i flagi; na przykład, jeśli pozycja pliku zostanie zmodyfikowana poprzez
użycie lseek na jednym z deskryptorów, zmieni się również pozycja dla drugiego
deskryptora.
Te dwa deskryptory nie współdzielą jednak znacznika "zamknięcia przy uruchomieniu"
(close-on-exec). Znacznik ten dla kopii jest wyzerowany, co oznacza, że kopia nie zostanie
zamknięta podczas wywołania exec.
Po pomyślnym zakończeniu zwracany jest nowy deskryptor.
F_GETFD
Odczytanie znacznika "zamknięcia przy uruchomieniu" (close-on-exec). Jeśli bit
FD_CLOEXEC jest równy 0, to plik pozostanie otwarty po wykonaniu exec, w przeciwnym
przypadku zostanie zamknięty.
F_SETFD
Nadanie
znacznikowi
"zamknięcia
przy
wartościokreślonej przez bit FD_CLOEXEC arg.
uruchomieniu"
(close-on-exec)
Znaczniki stanu pliku
Z deskryptorem pliku stowarzyszonych jest kilka znaczników inicjalizowanych przez open(2),
które mogą ewentualnie być modyfokowane przez fcntl(2). Znaczniki są współdzielone
przez kopie (wykonane za pomocą dup(2), fork(2), itp.) tego samego deskryptora pliku.
Znaczniki i ich znaczenie są opisane w open(2).
F_GETFL
Odczytanie znaczników deskryptora.
F_SETFL
Nadanie tym znacznikom deskryptora, które określają stan pliku, wartości określonej przez
arg. Pozostałe bity (prawa dostępu, znaczniki tworzenia pliku) w arg pozostają
niezmienione. Pod Linuksem polecenie to może zmieniać jedynie znaczniki O_APPEND,
O_NONBLOCK, O_ASYNC i O_DIRECT.
Zalecam zapoznać się z pełnym manualem dla fnctl.
Obsługa I/O
The POSIX asynchronous I/O (AIO) interfejs pozwalający aplikacjom rozpoczęcie jednej lub więcej
asynchronicznej operacji wejścia/wyjścia (np. w tle). Aplikacja może informować o zakończeniu
operacji I/O na kilka sposobów: poprzez wysłanie sygnały, poprzez oraz nie informować wcale.
POSIX AIO zawiera następujące funkcje:
aio_read(3) Kolejkuje żądanie odczytu. Jest asynchronicznym odpowiednikiem read(2).
aio_write(3) Kolejkuje żądanie zapisu. Jest asynchronicznym odpowiednikiem write(2).
aio_fsync(3) Kolejkuje żądanie sync dla operacji wejśca/wyjścia na desktyptrorach plików.
Jest asynchronicznym odpowiednikiem fsync(2) oraz fdatasync(2).
aio_error(3) Uzyskuje status błędu zakolejkowanego żądania I/O.
aio_return(3) Uzyskuje status wyjścia zakończonych żądań I/O.
aio_suspend(3) Zawiesza wywołania zanim jedno lub więcej określonych żądań I/O nie
zostanie zakończonych.
aio_cancel(3) Próbuje anulować żądania oczekujące dla konkretnego desktyptora plików.
lio_listio(3) Kolejkuje kilka żądań I/O używając pojedynczego wywołania.
Struktura aiocb ("asynchronous I/O control block") określa parametry kontrolujące operacje I/O.
Argument tego typu można zastosować do wszystkich wyżej wymienionych funkcji. Ta struktura
określa się następującą składnią:
#include <aiocb.h>
struct aiocb {
/* Kolejność pól zależy od implementacji */
int
aio_fildes;
off_t
aio_offset;
volatile void *aio_buf;
size_t
aio_nbytes;
int
aio_reqprio;
struct sigevent aio_sigevent;
int
aio_lio_opcode;
/* desktyptor pliku */
/* offset pliku */
/* położenie bufora */
/* długość transferu */
/* priorytet żądań */
/* metoda powiadomień */
/* tylko dla: lio_listio() */
};
/* Kody operacji dla 'aio_lio_opcode': */
enum { LIO_READ, LIO_WRITE, LIO_NOP };
Pola struktury:
aio_filedes Deskryptor na jakim ma być wykonana operacja wejścia/wyjścia.
aio_offset
Offset pliku na jakim ma być wykonana operacja wejścia/wyjścia
aio_buf
Bufor używany do transferu danych podczas operacji odczytu i zapisu.
aio_nbytes Wielkość bufora wskazanego przez by aio_buf.
aio_reqprio Pole określa wartość odejmowaną od priorytetu czasu rzeczywistego wątku
wywołującego, w celu określenia priorytetu realizacji żądania I/O (zobacz
pthread_setschedparam(3)). Wartość musi znajdować się pomiędzy 0 i wartością zwracaną
przez sysconf(_SC_AIO_PRIO_DELTA_MAX). To pole jest ignorowane dla operacji
synchronizacji plików.
aio_sigevent
Pole określa w jaki sposób wywołanie zostanie poinformowane po
zakończeniu asynchronicznej operacji I/O. Możliwymi wartościamik dla aio_sigevent są:
SIGEV_NONE, SIGEV_SIGNAL oraz SIGEV_THREAD. Zobacz sigevent(7).
aio_lio_opcode Typ operacji do wykonania, używany tylko dla lio_listio(3).
Proszę poczytać też o sposobie alokacji plików na dysku i inodach.