Linux系统io基于文件描述符的操作

基于文件描述符的操作为无缓冲的结构,没有流结构的读写指针。读写通过read/write函数来实现,每次需要设定读写数据的大小。

需要的头文件

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

#include<unistd.h>

 

基本操作单位

1.文件描述符 int 类型 主要就是使用文件描述符进行各种操作

//(2.文件状态  struct stat,(inode信息))

 

内核文件特征:
无缓冲设计,不过有单次读写大小的限制,由于每次读写都需要CPU陷入内核态,因此需要设定大小和4096(单次支持的最大数量接近)

内核文件支持的各种操作

打开文件,返回文件描述符

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

int open(const char *pathname, int flags, mode_t mode);//当设置了O_CREAT,生成了新的文件时使用

需要根据需要设定flags,即打开文件的方式,常用的有

关闭文件

int close(int fd);

 

读操作

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

其中,void*为数据需要写入的地址,可以是ascii写入也可以是二进制写入,通过size_t设定最大读取数量

通过ssize_t返回实际读取数量。是从文件读取到cpu。将读到的数据存入buf中

 

写操作

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

将buf中的数据写入到文件中,返回实际写入的数量

 

变更文件的大小

int ftruncate(int fd, off_t length);

将指定文件描述符的附件,调整为length的大小,如果原文件比较大的话就截断,如果原文件比较小的话,则扩容,在之前没有写入的位置补‘/0’

可用于生成文件空洞,以及后面的直接映射功能

 

文件映射

->建立映射

//一般蓝色部分可自由设定,其他为固定格式

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

不经过cpu的缓冲处理,直接将文件映射到内存的一个堆空间里,堆空间的改变直接影响到文件的内容

char* ch = (char*) mmap(NULL,10,PROT_READ|PROT_WRITE,fd,0);

->解除映射

int munmap(void *addr, size_t length);

munmap(ch,10)

void*指在内存分配的堆空间的首地址,可以部分解除映射。

 

文件的定位

利用此函数也可以实现文件空洞,不过需要在的最后一个地址处写入一个字符,

 

获取文件信息

获取文件有两种方式,1.通过文件名,2.通过文件描述符

c语言很多函数是通过传入指针来实现的赋值

 

 

通过stat结构体,主要可以获取

1.文件类型和模式

2.uid gid

获取passwd文件中关于用户的信息

 

 

获取关于group的相关信息

#include<grp.h>

struct group *getgrnam(const char *name);

struct group *getgrgid(gid_t gid);

3.获取文件的大小,以及访问,修改,状态改变的时间

4.文件所在的设备信息

 

文件描述符的复制:用途重定向

 

注意dup2使用后会默认关闭新文件描述符,后面如果想重定向回来需要提前备份一个

 

本质是是对文件描述符的操作,没有改变文件本身。更改的是文件描述符指向的文件

其中

dup 会找到未使用的最小的文件描述符,复制原来的文件描述符,相当于创造了一个文件的硬连接。

dup2 使用新的文件描述符来替代旧的文件描述符,新的文件描述符 如果之前有连接的文件的话,会先执行一次文件描述符的关闭操作。新旧文件描述符都会指向旧的文件描述符指向的对象,新文件描述符原指向对象丢失

dup3在多线程中会用到

 

 

 

 

文件描述符和指针

fopen函数实际在运行的过程中也获取了文件的文件描述符。使用fileno函数可以得到文件指针的文件描述符。

 

 

The  function  fileno() examines the argument stream and returns the integer file descriptor used to implement this stream.  The file descriptor is still owned by stream and will be closed when fclose(3) is called.  Duplicate the file descriptor with dup(2) before passing it to code that might close it.

 

与标准的输入输出流对应,在更底层的实现是用标准输入、标准输出、标准错误文件描述符表示

的。它们分别用STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO三个宏表示,值分别是0、

1、2三个整型数字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值