浅谈库,进程,线程---C语言学习(5)
来源:互联网 发布:好用的面霜干皮 知乎 编辑:程序博客网 时间:2024/05/16 10:05
前述
最近要总结的东西好多,因为讲座讲了很多,但是感觉虽然面很广,但是理解的并不深入,本篇只是记录一下现在的理解,以后深入研究后再回来纠正吧。
正文
主要说说静态库和动态库,然后进程和线程只是说一些特殊的需要注意的地方吧。
1.静态库
制作方法是将写好的函数先编译,然后用ar命令制作库。
gcc -c fun.c -o libfun.o //编译生成目标文件ar rcvs libfun.a libfun.o //将目标文件制作为一个静态库gcc main.c -static -L. -lfun // -L指明静态库所在位置 -l加库名
要注意的是ar生成的文件必须名字为lib*.a 这样链接器才能正确找到
静态库的好处 库函数在程序编译时就载入可执行程序中,因此程序运行时不再需要库了。
缺点,所有的库函数都在程序中,所以使得程序体积很大,也许库里边有10个函数,但我只需要一个,但我依然要将剩余的9个也链接到程序中,造成空间的浪费。其次,对库函数的改动后就必须再次编译,链接。
2.动态库
动态库的优势便是弥补了静态库的不足,动态库在编译时不载入程序,在运行时需要调用库函数才会去载入,使得程序体积“瘦身”,同时,对库函数的更新(不改变函数类型),不需要再次链接,只需要更新库函数。
gcc -fPIC -shared fun.c -o libfun.sogcc main.c -L. -lfun
我对动态库的理解便是将库函数编译链接后,程序知道去哪里找到需要调用函数的入口,所以当需要更新库函数时,只需要再次编译,可执行文件就完成了更新。(此处理解不是很透彻,只是说了目前的理解,肯定不准确,以后再深入)
动态库的不足便是需要保证运行时的环境,确保能够成功地找到需要的函数。
3.进程线程
首先说一个很重要的概念,线程的创建pthread_create()封装了clone()函数,所以线程也可以看成是一个轻量级的进程。
frok创建子进程,父子进程共享.text段,子进程获得父进程数据段、堆和栈的副本,由于在fork之后经常跟随者exec,所以很多实现并不执行父进程数据段、堆和栈的完全复制,而是使用写时复制(Copy-On-Write,COW)技术。这些区域由父子进程共享,并被内核设为只读,如果父子进程试图修改这些区域,则内核只为修改区域的那块内存制作一个副本。
所以当我们写下这样一个程序时
int main(void){ printf("xiyou linux group"); fork();}
结果会打印两次xiyou linux group
第一次父进程将打印的字符放在stdout中,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上,但是,只要看到有 \n 则会立即刷新stdout,因此就马上能够打印了,否则当进程结束时才会打印。子进程stdout缓冲里面也有字符串,所以两个进程结束时都会打印一次。
- 浅谈库,进程,线程---C语言学习(5)
- C语言笔记(进程,线程)
- c语言学习进程
- C语言:进程vs线程,如何选择?
- C语言进程与线程实例
- C语言回顾 学习进程
- Windows进程/线程浅谈
- Windows进程/线程浅谈
- Windows进程/线程浅谈
- Windows进程/线程浅谈
- 浅谈线程和进程
- 浅谈进程和线程
- 进程和线程浅谈
- 浅谈学习C语言与学习C++语言的关系
- 浅谈学习C语言与学习C++语言的关系
- C语言学习笔记系列(9)进程间通信
- 浅谈操作系统-进程与线程
- Linux下C语言开发(多任务编程之任务、进程、线程)
- 2016夏季练习——dp
- 某天想做某事于是...
- FutureTask 源码解析
- Javascript数组中迭代的几种写法
- FutureTask 深度解析
- 浅谈库,进程,线程---C语言学习(5)
- Unix中常见命令介绍
- select、poll、epoll之间的区别总结
- mysql密码忘记,强制修改
- 【Linux】CentOS7 常用命令集合
- 一个expect su实现输入su命令之后自动填写密码的功能
- Java基础语法
- 【CDOJ 1329】卿学姐与魔法
- 内经-移精变气论