Linux应用层-三种IO

Linux应用层面-三种IO

Linux五大管理

  1. 设备管理
  2. 文件管理
  3. 进程管理
  4. 网络管理
  5. 内存管理

/sbin与/bin

  • 这里面是可执行文件
  • ./test 移入这两个文件后就不用 ./ 了

/sbin

  • /sbin 目录包含的是系统管理员(superuser)使用的系统管理命令(system binaries)。
  • 这些命令通常用于对系统进行配置、管理和维护,因此需要超级用户权限(root权限)才能执行
  • 典型的命令包括诸如 ifconfig(网络配置)、fdisk(磁盘分区)、shutdown(关机)、reboot(重启)等

/bin

  • /bin 目录包含的是基本的用户命令(user binaries)
  • 这些命令可以被系统上的所有用户执行,通常不需要超级用户权限。
  • 典型的命令包括诸如 ls(列出目录内容)、cp(复制文件)、mv(移动文件)、rm(删除文件)、mkdir(创建目录)

umask

  • umask中u是un对应~

  • 总在创建文件和目录时存在

  • 0777&~(umask),这之后才是真正的权限

  • 在这里插入图片描述

三种IO

  1. 文件IO
  2. 标准IO
  3. 目录IO

一、文件描述符fd与节点inode关系

  • fd是在用户空间描述一个文件的说法

  • inode系统内核层面描述一个文件的说法

  • fd是inode的映射

  • Linux中每个文件都有一个inode

  • 用户空间fd前三个fd 0,1,2为默认标准输入,标准输出,标准错误

lseek函数

  • 用来移动文件里的光标位置
  • lseek(int fd, off_t offset, int whence);
  • whence可以设置三种 SEEK_SET、SEEK_CUR、SEEK_END

标准IO缓存与文件IO缓存

  • 区别在于有没有库缓存,标准IO有库缓存,函数前面有f

  • 应用层定义的buf属于用户空间的缓存

  • 内核空间的缓存应用层看不到但是read和write时会传过去
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

库缓存里面的内容转移到内核空间

  1. 库缓存(全缓存,行缓存,无缓存)

  2. 行缓存时内容后面有 \n 符号

  3. 行缓存时库缓存满了

在这里插入图片描述

fopen与fclose

在这里插入图片描述

fclose会把库函数中的数据强制写入内核空间

mode(r,a,w,+,b)
  • r只读
  • a 额外写
  • w删除写
  • +读写
  • b打开二进制文件

fgets与fputs

在这里插入图片描述

fflush(fp)

  • 跟fclose功能一样,将库缓存中的数据强制写入内核

stderr(无缓存)

  • 不是函数,只是参数,跟文件描述符0,1,2一样
  • 还有stdin,stdout

fseek,rewind,ftell

在这里插入图片描述

ftell
  • 用于取得当前的文件位置**(文件里面光标位置),成功则返回当前文件位置指示,出差返回-1L**

gets与puts

在这里插入图片描述

  • 默认标准输入,标准输出

  • 新行符就是enter键

fprintf,printf,sprintf

在这里插入图片描述

fgetc与fputc(一个字符)

在这里插入图片描述

  • 这两个函数不是行缓存

feof、ferror、clearerr

在这里插入图片描述

cat

  • 将自写cat命令./mycat 放入/bin就可以跟cat一样到处使用

fread与fwrite

在这里插入图片描述

read,write与fgetc,fputc与fgets,fputs与fread,fwrite效率比较

  • fgetc,fputc在用户空间花的时间长,系统层面花的时间短,因为用户层面多了个库函数缓存
  • read,write在用户层面花的时间短,系统层面花的时间长,因为进行多次系统调用
  • 效率高到低fread,fgets,fgetc,read
  • 从用户空间切换到内核空间花很多时间

二、静态库的制作与使用

在这里插入图片描述

  • main.c里面不需要声明需要调用的头文件,直接-L -l查找

动态库的制作与使用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 动态库与静态库同样是在生成可执行文件时通过-L -l 来链接到库
  • 但是动态库在可执行文件运行时要再次确定动态库位置,由上图三种方法确定
  • 第二种方法只是一时的,在这次终端下有用,重开终端就没了
  • /bin与/sbin下是可执行文件,/sbin/ldconfig ldconfig就是可执行文件
  • 第三种方法是永久的,先在/etc/ld.so.conf加入我们的库目录,然后运行 ldconfig /etc/ld.so.conf,就是先配置再运行加载一下

在编译器的默认搜索路径中的库会被默认链接吗

默认搜索路径的作用是让编译器能够找到库的位置,但并不会自动链接这些库。但是于标准库和一些常见的库,通常会由编译器默认链接,因此不需要显式地指定。

头文件与库函数

  • 头文件在编译时用到,为了说明你用到的函数,结构体等等存在
  • 库函数在链接时用到,动态库运行时还用到,为了具体使用函数,结构体等等

三、目录IO

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

mkdir

在这里插入图片描述

opendir与closedir

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值