用户态、内核态
系统调用是内核提供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的内核缓冲区更新到磁盘中,数据和元数据

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 打开后,会显示文件夹路径、文件夹包含的文件
字符设备和块设备
- 硬件设备分为字符设备和块设备,虽然有设备文件,但是设备文件不对应磁盘的文件,使用文件系统虚拟出来,内存维护,系统关机则消失。
- 字符设备在/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
数字转字符串: