1. 文件描述符
- 系统调用IO接口的操作句柄 --非负整数;
- 本质:内核中进程打开的文件描述信息表中的下标;
- 文件描述符与文件流指针
· 文件描述符:int ,系统调用IO接口的操作句柄;
· 文件流指针:FILE* ,库函数IO接口的操作句柄;
· 库函数与系统调用接口的关系:库函数封装了系统调用接口;
·· 通过库函数进行IO操作,最终是会归纳到使用系统调用接口完成IO操作。 - 库函数IO与系统调用IO的区别:
· 缓冲区:通常所说的那个换行刷新缓冲区的这个缓冲区,是文件流指针所有的,对于文件描述符或者系统调用来说是没有的;
· 文件流指针中的这个缓冲区被称为用户态缓冲区;
2. 重定向原理
- 标准输出重定向:>> / > , --把原本要写入标准输出的数据,写入到指定文件中,改变了数据的流向;
- 通过改变文件描述符这个下标位置所保存的文件描述信息,进而改变这个描述符所操作的文件,实现改变数据的流向;
- 文件描述符分配规则:最小未使用;
- C默认打开三个文件 – 标准输入文件(stdin)、标准输出文件(stdout)、标准错误文件(stderr),对应下标分别为0、1、2,
- dup2 --int dup2(int oldfd, int newfd);
· 让 newfd 从 oldfd 中拷贝文件描述信息地址;把 newfd 重定向到 oldfd 对应的文件上;
3. 动态库与静态库的生成与使用
1). 链接方式
- 动态链接:链接动态库,只是在生成的程序中记录库中的函数信息表,并没有将具体的代码实现写入到程序中,因此运行动态链接生成的程序时需要依赖动态库的存在,好处是内存中共享一份。
- 静态链接:链接静态库,在生成的程序中直接将库中所需函数的实现写入到可执行程序中,生成的程序比较大,但是没有依赖性。
2). 库的生成
- 库中的函数不能有main函数
- 1.将源码经过编译汇编之后,解释成为二进制指令;
gcc -c -fPIC testlib.c -o testlib.o - 2.将编译完成后的二进制指令组织打包成为库文件。
· 动态库:gcc --shared testlib.o … -o libtestlib.so
· 静态库:ar -cr libtest.a testlib.o …
3). 库的使用
- 使用-l选项指定要连接的库的名称:gcc main.c -o main -ltestlib
- 但是链接器在链接库文件生成可执行程序的时候回到指定的一些路径下去找库文件,找到了就链接,找不到就会报错
- 生成可执行程序时链接使用:使用gcc -l选项指定库名称 gcc main.c -o main -ltestlib
· 1. 库文件放到指定路径下:/usr/lib64
· 2. 设置环境变量:export LIBRARY_PATH=$LIBRARY_PATH:./
· 3. 使用gcc的-L选项指定库路径:gcc main.c -o main -L./ -ltestlib - 运行可执行程序时加载使用:仅针对动态链接生成的程序
· 1. 库文件放在指定路径下:/usr/lib64
· 2. 设置环境变量:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./