缓冲
1)全缓冲:缓冲区填满了才触发系统调用。例如fputc()
2)行缓冲:出现换行或缓冲区填满才出发系统调用。例如stdout
3)无缓冲:立即系统调用,没有缓冲区。例如stderr
open()
- 打开或创建一个文件。成功返回新分配的文件描述符,失败返回-1并设置errno
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// pathname: 打开或创建的文件名及所在路径
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
-
文件描述符:一个整型,值为0表示stdin标准输入,值为1表示stdout标准输出,值为2表示stderr标准错误
-
open()形参的 flags
1)必指定以下一个且仅允许指定一个,以下开头的 O_ 表示 orO_RDONLI:只读打开
O_WRONLY:只写打开
O_RDWR:可读可写打开
2)选项,用 | 或运算符拼接
O_CREAT:若文件不存在则创建,必须提供第三个参数mode指定文件访问权限
O_EXCL:若同时指定O_CREAT且文件已存在,返回出错
O_TRUNC:若文件存在且打开方式只读或可写,将其清空为0字节
O_APPEND:追加。在文件末尾追加数据
O_NONBLOCK:打开设备文件为非阻塞I/O
-
阻塞与非阻塞
1)如果open()不指定O_NONBLOCK,进程默认为阻塞:调用了阻塞的系统函数,进程进入睡眠状态,直到等待事情发生才运行。除了睡眠状态还有运行状态,运行状态有正在被调度执行和就绪状态两种
2)open()指定O_NONBLOCK则进入非阻塞状态,此时可用轮询方式进行监视,及不断试。 -
open()形参的 mode
1)指定文件权限,可用8进制数表示2)例如S_IRUSR表示八进制数00400, S_IRGRP表示八进制数00040, S_IROTH表示八进制数00004
前2位固定,第三位为user权限即wrx,第四位为group权限,第五位为others权限
Linux的umask命令
- open()函数设置mode文件权限的时候,会在umask的数值为1所在位进行面具遮掩,即此位不能修改。可设置umask 0解除所有的限制
close()
- 关闭一个打开的文件。成功返回0,失败返回-1并设置errno
#include <unistd.h>
int close(int fd);
read() write()
- 打开的设备或文件中 读取/写 数据。成功返回 读取/写 字节数,失败返回-1并设置errno
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, void *buf, size_t count);
lseek()
- 与库函数fseek()类似。记录当前文件读写位置
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
- 函数参数 whence: 1) SEEK_SET 表示文件开头 2)SEEK_CUR 表示当前位置 3)SEEK_END 表示文件结尾
fcntl()
- 改变一个打开文件属性,如读写追加非阻塞标志,无须重新open
#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); //flock上锁
int fcntl(int fd, int cmd, ...);
流重定向
- > : 重定向可写
- < : 重定向可读
- >>: 重定向追加可写
- <<: 重定向追加可读
- <>: 重定向可读可写
ioctl()
- 向设备发控制和配置命令。出错返回-1
#include <sys/ioctl.h>
int ioctl(int d, int request, ...);
-
d表示某个设备文件描述符
request表示ioctl命令
mmap()
- 把磁盘的一部分直接映射到内存,即文件相应位置有对应内存地址。可摆脱read/write函数直接用指针进行文件读写
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int port, int flag, int filedes, off_t off);
int munmap(void *addr, size_t len);
ext2文件系统
stat (2)
- 读取文件的inode。根据传入的文件路径找到inode填入stat结构体
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
dup() dup2()
- 复制一个现存的文件描述符,使2个文件描述符指向同一个file结构体
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd); //使newfd重定向到oldfd