文件描述符

用户态、内核态

系统调用是内核提供API给应用层,

库函数是通常以动态.so库文件提供。存放在 /lib 目录下。库函数大部分也是系统调用封装得来,

库函数是有缓存的,系统调用没有,
		库函数是应用层的,系统是内核的一部分的
		库函数移植好,

文件描述符

	文件句柄:非负整数,0,1,2,是标准输入、输出、错误

文件I/O缓冲

    read、 write 在系统调用在进行文件操作不会直接访问磁盘设备,是在用户缓存区和内核缓  
    存区之间复制数据,拷贝完函数就返回了,在后面某个时刻,内核才会写入磁盘中,也是说  
    系统调用write和磁盘操作不同步
   这个缓冲区被称为 **文件I/O操作** ,读写磁盘是比较缓慢,设备写入次数有限,也减少内核  
   磁盘的操作
1. 刷新文件IO的内核缓冲区
例如,想强制将内核缓冲区数据写入磁盘中,例如场景日志写入,可通过sync和syncfs、  
fsync、fdatasync
fsync 是对文件描述符操作,只有将数据和元数据写入磁盘才返回
     [^1]: 元数据:是文件属性的相关参数文件大小和时间戳权限等
fdatasync:是只写fd数据
sync:是对所有文件IO的内核缓冲区更新到磁盘中,数据和元数据
  ![在这里插入图片描述](https://img-blog.csdnimg.cn/6ca545991ac54b43a5e0642f0c549da2.png)
1. 直接IO:绕过内核缓冲区,也称裸IO
  在测试磁盘读写速度,就需要绕过内核缓冲区,数据库系统时,一般使用大大降低性能  

在这里插入图片描述

条件:
在这里插入图片描述

 查看块大小: 1、df -h查看根文件系统挂载的磁盘分区,
             2、在使用 tune2fs查看

在这里插入图片描述

 可用time ./app 查看程序执行时间

标准IO 自己维护stdio缓冲

 数据会先写入stdio缓冲,在一次性写入磁盘\
1. c语言提供函数设置stdio
  setvbuf:  缓冲区大小、缓冲模式、起始地址
  行缓冲、无缓冲、全缓冲,
  输入输出遇到遇到\n,则更新缓冲区
  使用则立即更新缓冲区
  在填满stdio时才缓冲
  setbuf 构建在setvbuf上
  setbuffer,指定缓冲区大小

文件类型

stat 文件名
ls -l 

在这里插入图片描述
在这里插入图片描述

!在这里插入图片描述

1. 文件夹也可以打开
		vi 打开后,会显示文件夹路径、文件夹包含的文件

字符设备和块设备

  1. 硬件设备分为字符设备和块设备,虽然有设备文件,但是设备文件不对应磁盘的文件,使用文件系统虚拟出来,内存维护,系统关机则消失。
  2. 字符设备在/dev目录下,也成为虚拟文件系统devfs,

stat函数

stat 查看文件属性,
返回值为文件属性,包括

在这里插入图片描述

   重点:st_mode 文件类型

在这里插入图片描述所以open表示权限的宏此处可以用下图
在这里插入图片描述
注意:八进制注意:八进制

utime utimes 修改* 文件属性 ,linux一切都为文件*

 前者为s,后者为us,但是这两个在修改文件访问时间的时候,内核会修改 最近修改文件的时间,
 futimens  、utimesnsat 是纳秒级别,可以只设置访问时间,修改时间不变,

在这里插入图片描述

linux系统存在硬链接和软链接

软链接是七种文件类型,类似的win10快捷方式

硬:ln 源文件 链接文件
软:    ln -s 源文件  链接文件
注:删除硬链接,磁盘的数据块不会被系统回收, 因为指向同一个inode,inode 只会记录硬链接数。直到记录为0,才删除。
		软链接是不同的inode,但是软链接的数据块存储的是源文件的路径名,当源文件删除时,软链接无效
ls -li 查看链接数
link 函数 可创建硬链接 symlink()软链接 
获取软连接 readlink()

在·在这里插入图片描述

在这里插入图片描述

目录 与文件的区别

在这里插入图片描述

 函数 mkdir  rmdir opendir readdir closedir
  opendir 目录句柄
  readdir 获取目录下所有文件的名称和inode号 每次都一个 需要循环读
  rewwinddir 重置目录流起点

进程的当前的工作目录

  getcwd
  更改进程目录 chdir和fchdir 一个是指定路径,一个是文件描述符fd
  unlink 删除文件,remove 删除文件和目录
  rename 文件重命名

字符

puts 和putchar fputc fputs 区别:
puts:只能向标准输出设备,且自动在输出字符串后加上 换行符
putchar :0-127 的十进制数,也可是一个字符重点:一个,无换行符
fputc:也可是一个字符重点:一个,无换行符,但是可以输出到文件中
fputs:字符串,可输出到文件中
输入:
gets :不建议用,读完会释放分隔符
scanf :以 %s 输入时,空格 换行 TAB ,%c 是都打印 , 都是分隔符,读完不会释放分隔符
getchar:从标准输入读取一个字符,以无符号的char 强制转换为int形式返回
fgets:获取输入字符串,会将换行符读出来,作为字符串组成字符存在,在字符串后加上结束字符 \0
fgetc:一个字符

字符操作

 strcat 拼接字符串,将2参加入1参的末尾,完成后只有一个\0,但1必须有足够的空间容纳拼接好的字符,
 strncat,可以指定2参的字符串的长度
 strcpy:复制字符串
 strncopy:可以复制指定长度
 bzero:对 数组str初始化,是字符数组
 strcmp:比较字符串
 strncmp:比较字符串
 strchr:查找字符串某个字符 从字符串后面到前面查找
 strrchr:找到字符第一次出现的位置就返回
 strstr:查找子字符串,
 atoi:字符转int,
 atol:long型
 atoll:long long
 strtol:long
 strtoll:long long
 strtoul: 无符号的long
 strtoull:无符号的long long

在这里插入图片描述
数字转字符串:
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值