今天介绍的有以下五个内容:
1.printf 的缓冲区问题 2.静态库的创建和使用 3.共享库的创建和使用 4.静态库与共享库的区别 5.各种命令,库等文件的标准存放位置一,printf 的缓冲区问题
printf ( )的输出原理:将需要打印在屏幕上的东西先存入缓冲区之中,在缓冲区满足以下三种情况时,会将缓冲区中的内容全部打印在屏幕之上:
1.缓冲区满了 2.强制刷新缓冲区 "\n" ,fflush(stdout) (fflush:刷新文件 stdout屏幕输出文件) 3.程序要退出了 exit():第一步:刷新缓冲区 第二步:_exit()退出程序在后面才会介绍到的fork函数中,printf的缓冲区问题会被再次提到,他对于输出结果的影响非常大
本质上,printf()=>其中调用了write()
printf()中的数据先存放在缓冲区中,在缓冲区刷新后,将缓冲区的数据放入调用的write中从而进行打印
write():不存入缓冲区,直接进行打印 相较于printf( ),write( )缺少用户态缓冲,每次调用都会触发系统调用,大量短小输出时上下文切换频繁,性能差 而printf( )自带用户态缓冲区,在多次零散输出时,会合并成少量系统调用 减少用户态→内核态上下文切换,高频少量 IO 场景,使性能更高二,静态库的创建和使用
**库:**已经编译好的函数的集合
静态库:libxx.a 使用时会将库中函数的实现拷贝到文件中
静态库的创建:ar crv -o libxx.a xx1.o xx2.o ……
xx1.o xx2.o …… :待打包的目标文件(先由 gcc -c xxx.c 编译生成)静态库的使用:gcc -o main main.c -L路径 -l库名(如果生成的库放在了标准库中可以省略路径)
三,共享库的创建和使用
共享库:libxx.so(win中叫动态链接库)
在使用库时,如果共享库和静态库同名,Linux系统会默认使用共享库
ldd命令:ldd+程序名 查看程序所使用到的共享库
共享库的创建:gcc -shared -fPIC -o libxx.so xx1.o xx2.o ……
xx1.o xx2.o …… :待打包的目标文件(先由 gcc -c xxx.c 编译生成)共享库的使用:gcc -o main main.c -L路径 -l库名(使用时默认在在/usr/lib 或/lib下查找 可省去地址)
当共享库不在标准位置时,使用命令:
LD_LIBRARY_PATH=. (将当前位置赋给变量(共享库的储存路径))
export LD_LIBRARY_PATH (将变量设置为环境变量)
gcc -o main main.c -L路径 -l库名
四,静态库与共享库的区别
静态库:使用静态库会把库函数拷贝到可执行程序中,但只拷贝用到方法(函数)
共享库:共享库只做标记(不进行拷贝)
在运行程序时还需要链接,共享库装载到内存中,多个程序可共享使用 并不包含到可执行程序中,共享库更利于程序的升级
五,各种命令,库等文件的标准存放位置
头文件的标准位置:/usr/include
存放二进制可执行程序,命令的标准位置:/usr/bin,/bin
存放库文件的标准位置:/usr/lib,/lib…