linux下的文件概念和操作

1. 文件的概念:

文件在linux系统中,是对系统资源的一个抽象,是对系统资源进行访问的通用接口。linux下的系统资源都可表述为文件。这样做可以对这些资源提供接口,供系统编程接口设计。

2. 文件的类型:

普通文件:存储在系统磁盘上的普通文件,以字节为单位存储。文件系统本身不关心内容,只提供数据存储和访问的通道。文件内容是由应用程序解释的。

目录:目录是一种特殊的文件,可以打开,关闭以及进行相应操作

管道:(pipelinux中的一种进程间通信机制

设备文件:设备文件没有具体内容,对设备文件的读写操作实际上是与某个设备输入输出操作关联在一起。字符设备文件对应字符设备,块设备文件对应块设备。

符号链接:是一种特殊的文件,内容是指向另一个文件的路径。

Socket:也是进程间通信的机制,与管道不同的是,他们可以在不同的主机上通信,即网络通信。

3. 文件描述符

应用程序中表示被打开的文件的一个整数,通过这个整数可以对文件进行操作。对于内核,都是通过使用这个文件描述符引用文件。

文件的索引节点:(inode

文件的索引节点(inode)是文件的唯一标识。inode包含文件系统处理文件所需要的全部信息(如访问限,当前文件大小等)

存在两种类型inode:一个是内核inode,保存在内核;另一个是磁盘inode,保存在系统磁盘上。当进程打开一个文件时,保存在系统磁盘上的文件的inode就会被加载至内存,同时系统创建一个内核inode,当内核ionde被修改后,系统会将其同步到系统磁盘上。内核inode记录的是一些更通用的信息,忽略与具体的文件系统相关的一些信息。

4. 文件操作一般过程:

进程打开文件,若成功则返回一个文件描述符,应用程序通过文件描述符对文件操作,操作完成后,应用程序需要关闭文件。

函数有open,read,write,ioctl函数

open函数

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *pathname,int flags);

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

参数说明:

pathname:要打开或者创建的文件名称

flags:指定打开的文件操作方式可取值有:

(1)O_RDONLY:只读方式打开

(2)O_WRONLY:只写方式打开

(3)O_RDWR:以读写方式打开

上面的常量必须要指定一个。另外可以用位或的方式添加其他部分标志量.

(1)O_CREAT:如果被打开的文件不存在,则自动创建

(2)O_EXCL:如果O_CREAT标志已经使用,那么当pathname指定的文件已经存在,则open返回失败。

(3)O_TRUNC:如果被打开的文件存在并且是以可写的方式打开,则清空原有的内容。

(4)O_APPEND:新写入的内容被加到原有的内容之后,即打开文件的读写位置被置于文件末尾处。

mode:指定新文件的访问权限

返回值:成功返回文件描述符,错误返回-1,设置errno。

read函数

#include<unsitd.h>

ssize_t read(int fd,void *buf,size_t count);

各个参数及返回值说明:

fd:文件描述符

buf:读取到的数据所存入的区域

count:需要一次读取的字节

返回值:成功则返回读到的字节数,若到文件结尾则返回0,出错返回-1设置errno。

注意:

read函数返回值情况分析:

(1)返回conut值说明成功读取conut个字节的数据。

(2)返回一个大于0小于count的值,原因可能是由一个信号打断了读取过程,或发生错误,或者读取的有效字节数大于0但不足count个,或者在读入count个字节前已经结束。

(3)返回0,说明文件读取结束。

(4)阻塞,说明没有可读的数据,若采取的非阻塞的方式,则立即返回错误。

(5)返回-1且errno为EINTR,表示在读入有效字节前收到一个信号,这种情况可以重新进行读操作。

(6)返回-1且errno值为EAGAIN,说明是在非阻塞的方式下读文件,并且没有可读的数据。

(7)返回-1且errno值为非EINTR或EAGAIN,表示由其他类型错误发生。

write函数

#include<unistd.h>

ssize_t write(int fd,const void *buf,size_t count);

参数说明类比read函数。

注意:

write函数返回值情况分析:

返回值等于count,说明数据全部写入成功。

返回一个大于0小于count的值,说明部分数据没有写入,可能是因为写入过程被信 号打断,或者底层的设备暂时没有足够的空间存放所写入的数据。
阻塞,说明暂时不能写入数据,这种情况下如果以非阻塞方式操作文件,那么会立 即返回错误。
返回-1且errno的值为EINTR,表示在写入一个有效字节前收到一个信号,应用程序 可以再次进行写操作。
返回-1且errno的值为EAGAIN,这说明是在非阻塞方式下写文件但文件暂时不能写
入数据。
返回-1且errno的值为EBADF,表示给定的文件描述符非法,或者文件不是以写方
式打开的。
返回-1且errno的值为EFAULT,表示buf是无效指针。
返回-1且errno的值为EFBIG,表示写入的数据超过了最大的文件尺寸,或者超过了
允许的文件的读写位置。
返回-1且errno的值为EPIPE,说明写入时发生了数据通道断裂的错误,这只能够情
况只在文件是管道或socket的情况下发生。这种情况下,进程还将收到一个SIGPIPE
信号,信号的默认处理程序是使进程退出。

返回-1且errno的值为ENOSPC,说明底层设备没有足够的空间。

ioctl函数

linux系统上,那些不能被抽象为读写的操作都由ioctl操作实现。

对于设备文件来说,ioctl函数常用于修改设备的参数。

#include <sys/ioctl.h>

int ioctl(int fd,int request,...);

各个参数说明:

(1)fd:要操作的文件描述符

(2)request:代表要进行的操作,不同的(设备)文件有不同的定义

(3)可变参数,取决于request参数,通常指向变量或者数据结构的指针。

(4)返回值:成功返回0,部分操作返回非负值,出错则返回-1.

close函数

调用close函数关闭一个打开的文件。

#include <unistd.h>

int close(int fd);



例子可以参考代码类。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaYQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值