[Linux Programming] File - 文件

low-level system calls - linux文件系统调用

#include <unistd.h>
size_t write(int fildes, const void *buf, size_t nbytes);
size_t read(int fildes, void *buf, size_t nbytes);

int close(int fildes); // be important to check the return result from close

int ioctl(int fildes, int cmd, ...);

#include <fcntl.h>
#include <sys/stat.h>
int open(const char *path, int oflags); 
int open(const char *path, int oflags, mode_t mode);
// @oflags 打开文件的方式
// - O_RDONLY / O_WRONLY / ORDWR / [ O_APPEND / O_TRUNC / O_CREAT O_EXCL ] ...
// @mode 在O_CREAT时使用
// - S_IR*SR / S_IW*SR / S_IX*SR (* = U / G / O)
// @example:
// open (“myfile”, O_CREAT, S_IRUSR|S_IXOTH);

#include <unistd.h>
#include <sys/types.h>
off_t lseek(int fildes, off_t offset, int whence);
// @whence
// - SEEK_SET / SEEK_CUR / SEEK_END

standard I/O library - linux标准I/O库

在low-level system calls中, 文件描述符
在stdio中, 文件流

#include <stdio.h>
FILE *fopen(const char *filename, const char *mode);
// @mode 
// - "r" / "w" / "a" / "r+" / "w+" / "a+" / [ b / t ] ... 
int fseek(FILE *stream, long int offset, int whence);
int fflush(FILE *stream);
int fclose(FILE *stream); 

// input
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream); // ferror or feof

int fgetc(FILE *stream);
int getc(FILE *stream); // = fgetc
int getchar(); // = getc(stdin)

char *fgets(char *s, int n, FILE *stream); // get string until a newline
char *gets(char *s); // reads from the standard input and discards any newline, unsafe !!
// @return
// - if fgets successfully, return pointer to the string s, else return nullptr.

// output
size_t fwrite (const void *ptr, size_t size, size_t nitems, FILE *stream);
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream); // = fputc
int putchar(int c); // = putc(c,stdout)

// format
int printf(const char *format, ...); // output on the standard output
int fprintf(FILE *stream, const char *format, ...); // output on a specified stream
int sprintf(char *s, const char *format, ...); // output and a terminating null character
into the string s
int scanf(const char *format, ...); 
int fscanf(FILE *stream, const char *format, ...); 
int sscanf(const char *s, const char *format, ...);

// error
int ferror(FILE *stream);
int feof(FILE *stream);
void clearerr(FILE *stream);

// associate with file descriptor
int fileno(FILE *stream);
FILE *fdopen(int fd, const char *mode); // provides stdio buffers for fd, but mode should be same with low-level api - open(..., mode)
// other functions...
#include <errno.h>
extern int errno; // errno should copy to use
void perror(const char *s); // reported in errno
// @example:
// perror("error"); // when errno = EMFILE
// error: Too many open files // output

#include <string.h>
char *strerror(int errnum); // errno to string
#include <sys/mman.h>
void *mmap(void *start, size_t len, int prot, int flags, int fd, off_t off);
// @通过一个指针映射fd对应的文件内容, 如果文件内容由某种结构构成, 那么用过mmap后返回的指针就可以看作是数组地址, 随后如同数组一般访问数据.
// @start 映射区的开始地址, 一般为NULL
// @len 映射区的长度(如果是结构体数据, 那一般为结构体的整数倍)
// @prot 期望的内存保护标记, 不可与文件的打开模式冲突 bitwise OR
// - PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE
// @flags 指定映射对象的类型, 映射选项和映射页是否可以共享
// - MAP_PRIVATE | MAP_SHARED | MAP_FIXED | ...
// @off 文件映射的偏移量, 一般设置为0, 表示从文件最前方开始映射, off必须为分页大小的整数倍

int munmap(void *addr, size_t len);
// @解除映射

int msync(void *addr, size_t len, int flags);
// @flags 同步修改到文件, 或使修改无效, 重新从文件同步数据
// - MS_ASYNC | MS_SYNC | MS_INVALIDATE

发表评论

电子邮件地址不会被公开。必填项已用 * 标注