文件I/O

文件I/O #include <unistd.h>

①、不带缓冲,每个read/write都调用内核中的相应系统调用
②、通过文件描述符来访问文件
常用文件I/O函数: open() /creat() .  close(). read(). write(). lseek()

文件描述符: 是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。对于内核而言,所有打开文件都由文件描述符引用,当读写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传递给read或write。
1、open 和creat
调用返回的文件描述符一定是 最小的未用描述符数字
creat() 等价于open(pathname , O_CREAT|O_WRONLY|O_TRUNC,mode)
open()可以打开设备文件,但是不能创建设备文件,设备文件必须用mknod() 创建
ps: int mknod(const char *pathname, mode_t mode, dev_t dev);
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

	flags:O_RDONLY:只读方式打开文件
		O_WRONLY:可写方式打开文件
		O_RDWR:读写方式打开文件
		O_CREAT:如果该文件不存在,就创建一个新文件,并用mode参数为其设置权限 0666
		O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息errno。这一参数可测试文件是否存在。
		O_NOCTTY:如果路径名指向终端设备,不要把这个设备用作控制终端。
		O_TRUNC:文件存在,打开文件删除原有文件数据。
		O_APPEND:已追加方式打开文件,读写操作在文件尾进行。
	mode: 文件存取权限   root user other  0666 以八进制表示
/*临界资源保护*/
if((fd = open(filename , O_WRONLY|O_CREAT|O_EXCL,0644))== -1)
{
	fprintf(stderr , " Cannot open filename  ,please try agin \n");
	exit(-1);
}

2、read
ssize_t read(int fd, void *buf, size_t count);
example:
char buf[100];
read(fd,buf,sizeof(buf));
read调用成功返回读取的字节数,如果返回0,表示到达文件尾,返回-1,表示出错,通过errno设置错误码。
buf参数由调用者分配内存,使用后,由调用者释放。

3、write
ssize_t write(int fd, const void *buf, size_t count);
调用成功返回以写字节数,失败返回-1,并设置errno。
write的返回值通常于count不同,因此要循环将全部的数据写入文件。
注意append参数时,写的文件位置在文件尾。

4、lseek
off_t lseek(int fd, off_t offset, int whence);
调用lseek可显示的定位一个已打开的文件
lseek文件只对常规文件有效,对socket、pipe、fifo等无效

offset: 偏移量
whence:SEEK_SET:文件开头位置
		SEEK_CUR:文件指针的位置
		SEEK_END:文件末尾
返回值: 成功:文件的当前位移
		失败: -1  errno
		ps: 文件的位移量可以大于文件的当前长度,在这种情况下,对该文件的写操作会延长文件,并形成 空洞 。 空洞是否占用硬盘空间是由文件系统(file system)决定的。
		

.空洞文件有什么用?

空洞文件作用很大,例如迅雷下载文件,在未下载完成时就已经占据了全部文件大小的空间,这时候就是空洞文件。下载时如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,这就不是多线程了。如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。

https://blog.csdn.net/clamercoder/article/details/38361815

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值