Linux应用层面-三种IO
文章目录
Linux五大管理
- 设备管理
- 文件管理
- 进程管理
- 网络管理
- 内存管理
/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
- 文件IO
- 标准IO
- 目录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时会传过去
库缓存里面的内容转移到内核空间
-
库缓存(全缓存,行缓存,无缓存)
-
行缓存时内容后面有 \n 符号
-
行缓存时库缓存满了
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