文件IO

来源:互联网 发布:麦当劳和肯德基 知乎 编辑:程序博客网 时间:2024/06/06 12:09
1、系统调用:用户空间进程访问内核的接口;把用户从底层的硬件编程中解放出来;极大的提高了系统的安全性;使用户程序具有可移植性;是操作系统的一部分。
2、在Linux中,我们可以通过open系统调用打开一个文件,可以获得一个文件描述符(fd),这个fd表示打开的文件,我们可以read系统调用来读文件,可以通过write系统调用来写文件,通过close系统调用关闭文件
文件相关系统调用函数
1、打开文件
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:打开一个文件(可以打开设备文件)
参数:
@pathname:打开文件的路径名
@flags: O_RDONLY:只读方式打开文件。
O_WRONLY:可写方式打开文件。
O_RDWR:读写方式打开文件。
以上三个参数互斥
O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限。
O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。
O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据。
O_APPEND:以添加方式打开文件,所以对文件的写操作都在文件的末尾进行。
注意:
(1)这些标示可以用"|"运算符连接在一起使用
(2)如果使用了O_CREAT参数,需要指定创建文件的权限
@mode 用来指定文件创建时的权限,八进制数表示,如:0666
注意:新建文件的实际权限 mode & ~umask
返回值:成功返回文件描述符,失败返回-1
例如:open("/home/linux/hello.c",O_CREATE|RDWR,0666);

程序运行的时候,操作系统默认打开了标准输入,标准输出,标准出错
标准输入:0
标准输出:1
标准出错:2
文件描述符分配原则:最小未使用
2、写文件
ssize_t write(int fd, const void *buf, size_t count);
功能:向一个文件描述符中写入数据
参数:@fd:文件描述符
@buf:写入数据的首地址
@count:希望写入数据的数量
返回值:成功返回实际写入的数量,失败返回-1。
3、读文件
ssize_t read(int fd, void *buf, size_t count);
功能:从一个文件描述符中读取数据
参数:@fd:文件描述符
@buf:读取数据存放的地址
@count:希望读多少个
返回值:成功返回实际读到的数量,失败返回-1;
4、文件定位
off_t lseek(int fd, off_t offset, int whence);
功能:设置文件读写位置指针
参数:@fd:文件描述符
@offset:偏移量
@whence:偏移的基准
SEEK_SET:以文件开头为基准
SEEK_CUR:以文件当前的位置为基准
SEEK_END:以文件末尾为基准
返回值:返回偏移后的文件读写指针位置,失败返回-1;
lseek注意事项:
(1)每个打开的文件都有一个与其相关的“当前文件位移量”,它是一个非负整数,用以度量从文件开始处(也就是从0处)计算的字节数。
(2)通常,读/写操作都从当前文件位移量处开始,在读/写调用成功后,使位移量增加所读或者所写的字节数。
(3)lseek()调用成功返回新的文件位移量,失败返回-1,并设置errno。
(4)lseek()只对常规文件有效,对socket、管道、FIFO等进行lseek()操作失败。
(5)lseek()仅将当前文件的位移量记录在内核中,它并不引起任何I/O操作。
(6)文件位移量可以大于文件的当前长度,在这种情况下,对该文件的写操作会延长文件,并形成空洞(注意:是文件位移量大于文件的长度,并对该文件写操作,不然是不会形成空洞的,带有空洞的文件也叫稀疏文件),空洞并不占用物理空间,所以这暗示着文件系统上的所有文件加起来的空间大小可以超过实际物理磁盘的大小。
4、获取文件属性函数
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
三个函数的返回:若成功则为0,若出错则为-1,并且设置errno.
给定一个pathname的情况下:
stat函数返回一个与此命名文件有关的信息结构,当命名的文件是一个符号连接时,返回的是目标文件的文件信息
fstat函数获得已在描述符filedes上打开的文件的有关信息
lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。

原创粉丝点击