底层系统调用
open系统调用
open可以创建一个新的描述符,成功返回文件描述符,失败返回-1,通常open系统调用不需要头文件sys/stat.h
和sys/types.h
但在某些UNIX系统上,它们必不可少,如果两个程序同时打开一个文件,它们会分别得到两个不同的文件描述符。如果它们都对文件进行写操作,那么它们会各写各的,分别接着上次离开的位置继续往下写。数据不会交织,而是彼此覆盖。两个程序对文件读写位置(偏移值)不同。可以通过使用文件锁防止这种现象出现。
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开
O_APPEND:把写入数据追加在文件末尾;
O_TRUNC:把文件长度设置为0,丢弃已写内容;
O_CREAT:如果需要,就按参数mode中给出的访问模式创建文件;
O_EXCL:与O_CREAT一起使用,确保调用者创建出文件。Open调用是一个原子操作,也就是说,它只执行一个函数调用。使用这个可选模式可防止两个程序同时创建一个文件。
S_IR(orW\X)USR 创建者权限
S_IR(orW\X)GRP用户组权限
S_IR(orW\X)OTH其他人权限
#include"fcntl.h"
#include"sys/types.h"
#include"sys/stat.h"
int open(const char *path ,int oflag); //path是文件路径,oflag通过必需文件访问模式和其他可选模式相结合的方式来指定
int open(const char *path ,int oflag,mode_t mode); //mode参数在头文件"sys/stat.h"中定义用于和O_CREAT联合使用创建文件
文件描述符" 0 & 1 & 2 " 及 " 分配规则 "
Linux 进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入 0, 标准输出 1, 标准错误 2
对应的物理设备一般是:
标准输入 0 —> 键盘 stdin
标准输出 1 —> 显示器 stdout
标准错误 2 —> 显示器 stderr
文件描述符的分配原则是从未分配的最小的描述符开始分配
write系统调用
系统调用write的作用是把缓冲区的buf的前nbytes个字节写入文件描述符关联的文件中,它返回实际写入的字节数。如果文件描述符有误或者设备驱动程序对数据块长度比较敏感,该返回值可能会小于nbytes。函数为0,就表示未写入任何数据;如果它返回的是-1,就表示在write调用中出现了错误;错误代码保存在全局变量errno中;
#include"unistd.h"
size_t write(int fildes,const void * buf ,size_t nbytes)
read系统调用
read的作用是:从与文件描述符fildes相关联的文件里读入nbytes个字节的数据,并把它们放到数据区buf中。它返回实际读入的字节数,这可能会小于请求的字节数。返回-1表示调用出现错误。
#include"unistd.h"
size_t read(int fildes,const void * buf ,size_t nbytes)
close系统调用
close调用用于终止文件描述符fildes与其对应文件之间的关联,文件描述符释放可以重新使用,检查close调用的返回结果十分重要,有的文件系统,特别是网络文件系统,可能不会在关闭文件前报告写操作出现的错误,这是因为在执行写操作数字未被确认写入。