系统io(文件io)
文件描述符:已打开文件的标志,非负整型数,当前可用最小作为新文件的文件描述符,默认范围0-1024
文件的打开:
int open(const char *path, int flag, int mode);
path:要打开文件的路径
flag:打开方式
O_RDONLY / O_WRONLY / O_RDWR 三选一
O_CREAT / O_TRUNC / O_APPEND
mode: mode&~umask创建文件的权限
返回值:成功--》文件描述符 -1 set errno
读:
ssize_t read(int fd, void *buf, int size);
fd:带读取的文件的文件描述符
buf:存储读取到的数据
size:buf大小
返回值:成功返回读到字节个数 -1失败 0结束
写
int write(int fd, const void *buf, int size);
fd:要写入的文件
buf:存储待写入的数据
size:待写入的字节个数
返回值: 成功返回写入的字节个数,失败-1
设置文件偏移量
int lseek(int fd, offset_t n, int whence);
whence: SEEK_SET开头 SEEK_CUR当前 SEEK_END末尾
返回值当前文件的偏移量
关闭
int close(int fd)
文件共享
进程表项:每一个进程
文件表:每打开
v结点表
文件描述符的复制--》重定向
int dup(int oldfd);
int dup2(int oldfd, int newfd);
./a.out > outfile 2>&1
dup2(fd, 1);
dup2(1, 2);
./a.out 2>&1 > outfile
dup2(1, 2);
dup2(fd, 1);
fcntl(2)
复制文件描述符
获得/设置文件状态标志
获得/设置文件描述符标志
获得/设置异步io所有权
获得/设置记录锁
标准io
文件流:FILE结构:fd,buf,bufsize,errflag,标准io打开文件的标记
标准输入文件流stdin 标准输出文件流stdout 标准错误输出stderr
缓冲
行缓冲stdout/stdin
无缓冲stderr
全缓冲
如何刷新缓存区
行缓冲遇到‘\n‘
全缓冲写满了
进程终止了
fflush(3)
打开
FILE *fopen(const char *path, const char *flag);
flag:r/r+/w/w+/a/a+
读写
字节
fgetc(3) / fputc(3) getc(3) / putc(3) getchar(3)/putchar(3)
行
fgets(3) / fputs(3) puts(3)
二进制
int fread(char *buf, int size, int nmemb, FILE *fp);
int fwrite(const char *buf, int size, int nmemb, FILE *fp);
格式化
printf(3) / scanf(3)
fprintf(3) / snprintf(3)
关闭
fclose(3)
偏移量(定位文件流位置)
fseek(3) / ftell(3)/rewind(3)
临时文件
tmpfile(3)
文件io和标准io区别与联系
文件io:
系统调用
实时性高
效率低
不能跨平台
标准io:
库函数
带缓存区
合并系统调用,减少io次数,提高效率
实时性低
原文:https://www.cnblogs.com/Yangon77/p/14551456.html