基础I/O **
回顾C库的 IO 接口
linux下 IO 的系统调用接口
文件流指针 文件描述符 文件重定向
linux下ext2文件系统 indoe节点
软链接/硬链接 动态库/静态库生成
1.回顾:fopen fclose fwrite fread fseek
(fprintf fgets sprintf snprintf printf)
mode: r r+ w w+ a a+
read ret=0
2.系统调用接口: open close read write lseek
write:
size_t write( int fd,const void *buf ,size_t count)
fd: 文件描述符
buf: 要写入的数据
count:要写入的数据长度
返回值:实际写入长度 失败:-1
read:
size_t read(int fd,const void *buf ,size_t count)
fd: 文件描述符
buf: 要写入的数据
count:要写入的数据长度
返回值:实际读取字节长度 失败:-1
lseek:
off_t lseek(int fd, off_t offset, int whence)
跳转到文件读写位置到whence位置偏移ofset个字节
fd:文件描述符
offset:偏移量
whence:要偏移的起始位置
close(fd); 关闭文件
3.文件描述符:非负整数
一个进程会打开很多文件,那么进程就需要对这些文件进行管理
描述+组织 描述(结构体) 组织(结构体数组)
进程通过file结构体描述文件,并且使用结构体数组将这些描述组
织起来进行管理,我们打开文件所获取的文件描述符其实就是这个数组
中对应文件描述信息的下标。我们用户通过下标找到文件描述信息,进
而对文件进行操作(操作句柄FILE)
文件流指针与文件描述符:
标准库接口的操作句柄是文件流指针
系统调用接口的操作句柄是文件描述符
文件流指针这个结构体中封装了文件描述符作为成员变量
缓冲区:缓冲区是文件流指针的缓冲区
文件缓冲区: 向文件写入数据是先写入缓冲区,等待缓冲区满了,才
写入文件;文件流指针中包含了缓冲区普通文件不具备
换行刷新缓冲区功能,只有标准文件才有这个功能
文件描述符的分配规则:
遵循最小未使用原则
文件重定向:
本质是改变文件描述符下标对应的文件描述信息
int dup(int oldfd)
让最小的未使用的fd指向oldfd位置
int dup2(int oldfd,int newfd)
让newfd也指向oldfd指向的位置
dup2:
> 清空文件原有内容,将新数据写入
>> 将新数据追加,写入到文件中
1.解析命令,判断是否有重定向符号
2.获取重定向文件名
3.以相应方式打开文件
4.重定向(dup2)不能在父进程中完成,因为一旦父进程重定向了
shell程序后续的界面就打印不出来,都会写入到这个文件中
4.linux下文件系统:管理磁盘文件
交换分区+系统分区(每个文件都有自己的系统分区)
inode节点(文件大小,权限,用户,时间,文件存储地址)
目录和普通文件有什么区别?
目录也是文件,只不过数据存储的是目录下的文件名和inode节点号
cat file流程:通过文件名在目录中获取文件inode节点->通过inode节点找
到数据存储位置->读取文件数据
软连接和硬链接:
硬链接:
ln a.txt b.txt
软链接:
ln -s a.txt b.txt
区别:
软链接是一个类似于快捷方式的文件/硬链接是一个文件的别名
硬链接文件具有相同的inode,所有硬链接文件通过inode操作数据
软链接文件和源文件不是同一个文件,拥有不同的inode节点号,访
问软链接文件,就是通过软链接文件中保存的源文件路径来访问文件
删除源文件,软链接失效;但是硬链接不影响,只是链接数-1(当一个文
件链接数为0时才真正删除一个文件,否则只是删除目录项)
软链接可以针对目录创建,但是硬链接不可以
软链接可以跨分区创建,硬链接不可以
df:查看分区挂载情况
linux下SATA接口类型硬盘命令方式:sda adb...
在进行安装系统的时候可以对磁盘进行分区操作
sda这块磁盘进行分区:sda1 sda2....
用户可以将各个分区挂载在指定目录下,至少需要一块分区需要挂载在根目录
跟磁盘及挂载相关命令: fdisk df -du
5.动态库 / 静态库
动态链接/静态链接
生成一个库需要将所有目标文件集合到一起,生成一个打包后的代码库
gcc -c a.c -o a.o
gcc -c b.c -o b.o
如何生成动态库
gcc -fPIC -c b.c -o b.o
gcc --share b.o -o libmy_b.so
-fPIC产生与位置无关代码
如何生成静态库:
gcc -c b.c -o b.o
ar -cr libmyb.a b.o
动态库命名:以lib为前缀, .so为后缀,中间是库名称
静态库命名:以lib为前缀, .a为后缀,中间是库名称
gcc 选项: -E -S -c -o -static -g
-fPIC:生成动态库需要--产生与位置无关代码
--share:生成共享库(动态库)而不是可执行程序
ar:静态库链接器--用于生成静态库
-c 创建静态库
-r 模块替换
链接库:
动态库或静态库的链接:生成可执行程序时,系统需要所有库都在指
定路径(/lib64)下,这时候才能找到这个库
如果不想将库放到/lib64下,这时候可以指定库的查找路径
gcc a.c -o a -L ./ -lmy_b
-L 指定库的搜索路径(默认路径找不到,就会到这里来)
-l 指定要链接库的名称
动态链接生成的可执行程序,需要动态库的存在并且存在于指定目录下
因此动态库直接拷贝到/lib64下
ldd a 查看一个可执行程序a所依赖的动态库