Linux下的文件I/O

本文详细比较了标准输入/输出(标准IO)与操作系统提供的文件I/O函数,着重讲解了文件描述符、open()、close()、read()、write()等核心操作,并阐述了在处理字符串和二进制数据时各自的优势。

标准I/O与文件I/O的函数对比

 在处理二进制数据的时候可以使用文件I/O,但对于处理字符串,标准I/O更加方便。

文件I/O是操作系统提供的API接口函数。文件I/O不提供缓冲机制

文件I/O-文件描述符

  • 每个打开的文件都对应一个文件描述符;
  • 文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符;
  • 文件描述符从0开始分配,依次递增(0-1023);
  • 文件I/O操作通过文件描述符来完成;
  • 0:标准输入;1:标准输出;2:标准错误。

文件I/O-open

open函数用来创建或者打开一个文件:

#include <fcntl.h>

int open(const char *pathname,int flags);
int open(const char *pathname,int flag,mode_t mode);

成功返回文件描述符;出错时返回EOF;

  • 打开文件时使用两个参数;
  • 创建文件时第三个参数指定新文件的权限,(只有在建立新文件时有效)此外真正创建文件时的权限会受到umask值的影响,实际权限是mode-umaks;
  • 可以打开设备文件,但是不能创建设备文件。

pathname:被打开的文件名;

flags :该参数可以是以下选项,多个使用 “|” 隔开:

  • O_RDONLY: 以只读的方式打开
  • O_WRONLY: 以只写的方式打开
  • O_RDWR : 以读写的方式打开
  • O_NONBLOCK: 打开时不阻塞
  • O_APPEND: 以追加的方式打开
  • O_CREAT: 创建并打开一个新文件
  • O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
  • O_EXCL: 如果指定的文件存在,返回错误
  • O_NOCTTY:文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
  • O_SHLOCK: 自动获取共享锁
  • O_EXLOCK: 自动获取独立锁
  • O_DIRECT: 消除或减少缓存效果
  • O_FSYNC : 同步写入
  • O_NOFOLLOW: 不追踪软链接

mode:被打开文件的存取权限,为8进制表示法。

umask:用来设定文件或者目录发的初始权限

  • 文件和目录的真正初始权限
  • 文件或录的初始权限=文件或目录的最大默认权限-umask(0666-0002)

文件I/O-close

close函数用来关闭一个打开的文件:

#include <unistd.h>

int close(int fd);
  • 成功时返回0;出错时返回EOF;
  • 程序结束时自动关闭所用打开的文件;
  • 文件关闭后,文件描述符不再代表文件。

文件I/O-read

read函数用来从文件中读取数据:

#include <unistd.h>

ssize_t read(int fd,void *buf,size count);
  • 成功时返回实际读取的字节数,出错时返回EOF;
  • 读到文件文件末尾时返回0;
  • buf是接收数据的缓冲区;
  • count不应该超过buf大小。

文件I/O-write

write函数用来向文件写入数据:

#include <unistd.h>

ssize_t write(int fd,void *buf,size_t count);
  • 成功时返回实际写入的字节数;出错时返回EOF;
  • buf是发送数据的缓冲区;
  • count不应超过buf大小。

文件I/O-lseek

llseek函数用来定位文件:

#include <unistd.h>

off_t lseek(int fd,off_t offset,int whence)
  • 成功时返回当前的文件读写位置;出错时返回EOF;
  • 参数offset和参数whence同fseek完全一样
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值