File API
/ \
by handle by name
by handle by name
-----------------------------------------------------------
Открытие/Создание n/a yes
Чтение/Письмо yes ---
Установка/запрос позиции yes ---
Установка/запрос размера yes ---
Сброс данных на диск yes ---
Установка/запрос аттрибутов yes yes
Установка/запрос времен yes yes
Установка/запрос владельцев yes yes
Удаление sometimes yes
Переименование --- yes
Создание ссылки --- yes
-----------------------------------------------------------
Операции с файлами
эти операции как правило по handle
Open/Create
открыть/создать
режим открытия
для чтения
для записи
для чтения/записи
для добавления (Append)
режим совместного доступа
share read
share write
share all
share delete
поведение при открытии
Режим открытия:
Права доступа к файлу проверяются именно при открытии. То есть в процессе работы
они уже не проверяются (практически всегда).
Совершенно особенный режим открытия Append. Другая семантика поведения.
В этом случае позиция в файле игнорируется и запись всегда ведется в самый конец файла
(что удобно если есть несколько паралельных программ пишущих в него - например если
это файл системного log).
Поведение при открытии:
Ситуация Действие
Файл не существует Вернуть ошибку
Создать новый файл (естественно нулевой длинны)
Файл существует Вернуть ошибку
Открыть файл
Урезать файл до нулевой длинны
![]() |
int open(const char* name, int flags) int open(const char* name, int flags, mode_t mode) O_APPEND O_ASYNC O_CREAT O_DIRECT O_DIRECTORY O_EXCL return error if file exist O_LARGEFILE O_NOCTTY O_NONBLOCK O_SYNC O_DSYNC O_RSYNC O_TRUNC S_IRWXU S_IRUSR S_IWUSR S_IXUSR S_IRWXG S_IRGRP S_IWGRP S_IXGRP S_IRWXO S_IROTH S_IWOTH S_IXOTH int creat(const char* name, mode_t mode) mode_t umask(mode_t cmask) open(pathname, O_CREAT, mode) = open(pathname, O_CREAT, (~mask) & mode); int mkstemp(char* template) // stdlib.h |
![]() |
HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); FILE_SHARE_READ FILE_SHARE_WRITE FILE_SHARE_DELETE CREATE_ALWAYS CREATE_NEW OPEN_ALWAYS OPEN_EXISTING TRUNCATE_EXISTING |
![]() |
ssize_t read(int fd, void* buf, size_t len)
ssize_t write(int fd, void* buf, size_t len)
off_t lseek(int fd, off_t pos, int origin)
SEEK_SET
SEEK_CUR
SEEK_END
ssize_t pread(int fd, void* buf, size_t count, off_t pos)
ssize_t pwrite(int fd, const void* buf, size_t count, off_t pos)
ssize_t readv(int fd, const struct iovec* iov, int count)
ssize_t writev(int fd, const struct iovec* iov, int count)
struct iovec
{
void* iov_base;
size_t iov_len;
}
int aio_read(struct aiocb* aicocbp)
int aio_write(struct aiocb* aiocbp)
int aio_error(const struct aiocb* aiocbp)
ssize_t aio_return(struct aiocb* aiocbp)
int aio_cancel(int fd, struct aiocb* aiocbp)
int aio_fsync(int op, struct aiocb* aiocbp)
int aio_suspend(const struct aiocb* const list[], int cbcnt, const struct timespec* timeout)
struct aiocb
{
int aio_fildes;
off_t aio_offset;
void* aio_buf;
size_t aio_nbytes;
int aio_reqprio;
struct sigevent aio_sigevent;
int aio_lio_code;
}
|
![]() |
int ftruncate(int fd, off_t len) int truncate(const char* name, off_t len) |
сброс буфферов на диск (flush/commit)
![]() |
int fsync(int fd) int fdatasync(int fd) void sync(void) |
![]() |
int stat(const char* path, struct stat* buf)
int fstat(int fd, stryct stat* buf)
int lstat(const char* path, struct stat* buf)
struct stat
{
dev_t st_dev;
ino_t st_ino;
mode_t st_mode;
S_IFBLK
S_IFCHR
S_IFDIR
S_IFIFO
S_IFLNK
S_IFREG
S_IFSOCK
S_ISUID
S_ISGID
S_ISVTX
nlink_t st_nlink;
uid_t st_uid;
gud_t st_gid;
dev_t st_rdev;
off_t st_size;
blksize_t st_blksize;
blkcnt_t st_blocks;
time_t st_atime; last access
time_t st_mtime; last modification
time_t st_ctime; last metadata modification
st_atime_nsec; // Linux
st_mtime_nsec; // Linux
st_ctime_nsec; // Linux
}
int chmod(const char* path, mode_t mode)
inf fchmod(int fd, mode_t mode)
int chown(const char * path, uid_t owner, gid_t group)
int lchown(const char* path, uid_t owner, gid_t group)
int fchown(int fd, uid_t owner, gid_t group)
int utime(const char* path, const struct utimbuf* timebuf)
struct utimbuf
{
time_t actime; // access time
time_t modtime; // modification time
}
int utimes(char* filename, struct timeval tvp[2]); // microsecond precision
|
Rename/Delete эти операции как правило по имени удаление файла переименоване файла
![]() |
int unlink(const char* pathname) int rename(const char* oldpath, const char* newpath) int remove(const char* path) // file or dir |
![]() |
int link(const char* oldpath, const char* newpath) |
![]() |
int symlink(const char* oldpath, const char* newpath) ssize_t readlink(const char* path, char* buf, size_t bufsize) |
![]() |
int ioctl(int fd, int request, ...) int fcntl(int fd, int request, ...) F_DUPFD F_GETFD F_SETFD F_GETFL F_SETFL F_GETLK F_SETLK non-blocked F_SETLKW blocked |
![]() |
int dup(int fd); // dup(fd) = fcntl(fd, F_DUPFD, 0) int dup2(int fd, int fd2); // dup2(fd, fd2) = close(fd2), fcntl(fd, F_DUPFD, fd2) |
![]() |
fcntl
F_XXXLK
struct flock
{
short l_type;
F_RDLCK
F_WRLCK
F_UNLCK - remove locking
short l_whence;
off_t l_start;
off_t l_len;
pid_t l_pid;
}
int lockf(int fd, int op, off_t len);
|
![]() |
int mknod(const char* path, mode_t perm, dev_t dev) |
![]() |
ssize_t getxattr(const char* path, const char* key, void* value, size_t size) ssize_t lgetxattr(const char* path, const char* key, void* value, size_t size) ssize_t fgetxattr(int fd, const char * key, void* value, size_t size) int setxattr(const char* path, const char* key, const void* value, size_t size, int flags) int lsetxattr(const char* path, const char* key, const void* value, size_t size, int flags) int fsetxattr(int fd, const char* key, const void* value, size_t size, int flags) ssize_t listxattr(const char* path, char* list, size_t size) ssize_t llistxattr(const char* path, char* list, size_t size) ssize_t flistxattr(int fd, char* list, size_t size) int removexattr(const char* path, const char* key) int lremovexattr(const char* path, const char* key) int fremovexattr(int fd, const char* key) |