linux:基础I/O

更多知识点:linux目录索引


系统文件IO
#include<fcntl.h>
int open(const char* pathname,int flags);
int open(const char* pathname,int flags,mode_t mode);

pathname:要打开或者创建的目标文件
falgs:
    O_RDONLY:只读
    O_WRONLY:只写
    O_RDWR:写读
    O_CREATE:创建文件
注:三选一

返回值:fd

从小到大找第一个没有被使用的分配

查看已打开的文件描述符:/proc/pid/fd

通过open打开一个文件,返回一个整数,通过这个整数就可以操作文件,这个整数我们称之为文件描述符(fd)
打开文件是一种系统资源,fd到底可以打开多少文件

如何查看当前进程最多可以打开多少文件?
ulimit -n (nz值可以修改)
ulimit -n 2048  :修改为2048个文件

系统到底可以打开多少个文件?
和内存有关,1G内存大概可以打开10万个
cat /proc/sys/fs/file-max

open函数
       int open(const char *pathname,//需要打开的文件名
     int flags);//  O_RDONLY
                    O_WRONLY//这三个必须只能选一个
                    O_RDWR

    返回文件描述符,从小到大找到第一个没有被使用的分配

    /proc/pid/fd/  可以查看已经被打开的文件描述符

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

write函数
ssize_t  write(int fd,
        const void* buf,//向文件输入的数据位置
        size_t len);//数据个数

注:如果原文件有内容,不会清空文件;如果想要清空源文件,用O_TRUNC

注:fsync

write是用户写到内核的函数,不会将数据刷新到磁盘中去

使用fsync可将数据立即刷新到磁盘中去

例子:

image


read函数
//读取磁盘/设备数据
ssize_t read(int fd,//打开的文件描述符
          void* buf,//用户准备的缓存区
        size_t size)//缓存区大小

随机读写:定位文件当前的读写位置


off_t  lseek(int fd,
        off_t offset,//偏移量
        int where);//基准位置SEEk_SET,SEEK_CUR,SEEK_END

    offset大于0,向后移动单位数,小于0,向前移动

    返回值为当前位置

作用:求的文件大小

例:跳着跳着读文件内容

image


输出重定向

文件描述符:

文件描述符就是从0开始的最小整数,当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,必须让进程和文件关联。每个进程都有一个文件指针,指向一张表FILE_STRUCT,表中存放的是一个个指针数组,数组中的元素是指向打开文件的指针。而文件描述符就是数组的下标。拿着文件描述符就可找到文件

这里写图片描述

dup函数

int dup(int old)
    复制old文件描述符给新的文件描述符,返回新的文件描述符
    选择新的文件描述符规则:从小到大选择第一个没有被使用的文件描述符
输出重定向原理

当关闭文件描述符1(即标准输出)时,系统去找没有被使用最小的文件描述符,找到1,故将1号文件描述符给了myfile.txt,故此输出时不在往屏幕上打印,而是输出在myfile.txt文件中

这里写图片描述

例子:

image

文件系统:

输入命令,从磁盘上读取文件信息,不直接去磁盘上读取文件信息,而是去找文件对应的inode(文件编号),通过inode在磁盘上找到对应的文件信息

image

超级块:存放文件系统本身的结构信息

inode表:存放文件属性,如:文件大小,所有者,最近修改时间等

数据区:存放文件内容

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值