在Linux操作系统中,万物皆文件(everything is file),而今天进行复习的就是文件I/O,文件I/O基于POSIX标准,在进行文件I/O的过程中,每一次操作都会进行系统调用,增加大量系统开销,而我们后面讲到的标准I/O就大大弥补这一个缺陷。
首先我们从最基础的
open
函数开始:
int open(const char *pathname, int flags, mode_t mode);
pathname :文件名或者路径名。
flags:文件打开方式。
mode:文件存取权限。
下面我们一一的来说明这些参数:
文件名和路径名需要放在” “中,举个例子open(“hello.txt”)
一个文件有多个文件打开方式,这些flag参数可以通过”|”操作组合在一起,下面列出几个常见的flag参数:
O_RDONLY,O_WRONLY,O_RDWR
,这三个参数不能相互组合。
O_RDONLY
:表示以只读方式打开文件,类似于标准I/O中的”r”权限。
O_WRONLY
:表示以只写方式打开文件,类似于标准I/O中的”w”权限。
O_RDWR
:表示以读写方式打开文件,类似于标准I/O中的”r+”权限。
O_CREAT
:表示如果打开文件不存在,就创建一个新文件。
O_EXCL
:表示如果使用
O_CREAT
时目标文件存在,则返回错误信息。可以用于测试目标文件是否存在。
O_TRUNC
:表示使用
O_CREAT
时文件已存在,清空文件中所有数据,并且在设置文件大小为1。
O_APPEND
:表示使用
O_CREAT
时文件已存在,把要写入的数据添加进文尾(文件读写位置自动指向文尾)。
使用man手册可以查看剩下的flag参数,在这不做赘述。
mode是文件存储权限,可以用宏定义的方式表示,也可以用八进制的方法表示,类似0666,换成二进制就是:
|0110(文件所有者的权限)|0110(文件所在用户)|0110(其他用户)|
|w,r,x|w,r,x|w,r,x|
后三位代表着读w,写r和可执行权限x,所有权限都有就是0777。
注意,我们最后看到的文件权限还要再经过一道步骤,文件权限掩码,umask。
(mode & ~umask)这样子才是最后我们看到的文件权限,在Linux终端下输入umask查看当前文件掩码,一般是八进制0002。终端下输入umask+八进制数字可以修改,但是注意,这样修改的文件掩码只在该终端上修改,如果重启或者开其他终端,umask恢复初始值。
open
函数成功返回文件描述符,失败返回-1。返回的文件描述付是int型。
close
函数用于关闭一个已经打开的文件。一般我们在完成对文件操作后,添加
close
函数。
close(文件描述符);成功返回0,失败为-1。
下面介绍下如何在终端修改文件权限,使用
chmod
函数来修改
int chmod(const char *path, mode_t mode);
和open函数类似,第一个参数也是文件名,也可以是路径名,mode也和open函数中mode类似,可以用宏定义或者八进制的方式去写。
下面写一个简单的open函数:
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd;//文件描述符
fd=open("test.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
//以读写,不存在就创建,存在就清空的方式打开test文件
if(-1 == fd)
{
perror("open");
exit(-1);
}
close(fd);//关闭文件描述符
return 0;
}
写在最后:
这是我的第一篇博客,写的不好还望多多指正。