Please enable JavaScript.
Coggle requires JavaScript to display documents.
C (:watermelon:库 (:two:动态库 (:banana:制作 (:one:生成与位置无关的.o文件:gcc -fPIC -c *…
C
:watermelon:库
-
:two:动态库
-
-
-
:melon:位置有关 & 位置有关
:explode:程序启动后,进程会有4GB的地址空间,占用的是虚拟内存空间(不是真正的内存,而是硬盘空间),0-3G为用户区.
:bread:解释
:one:程序启动后通过*动态链接器加载动态库,动态库会被加载到地址空间的共享库区域里
-
-
-
-
:lemon:动态链接器
:explode:在"$LD_LIBRARY_PATH"(用户自定义的)和默认的路径(lib/等目录)下查找动态库,并加载到程序中
-
-
:heavy_dollar_sign:卖代码的时候不直接给源代码,而是给库
:lemon:文件
-
:warning:C库函数会提供缓冲区,但是Linux的I/O函数不提供缓冲区
-
:watermelon:标准库函数 & 系统函数
:bread:fprintf介绍
:bread:printf将文件描述符等信息传递给应用层的write函数.write函数拿到文件描述符和字符串,转换用户空间和内核空间.在内核空间有个系统调用sys_write().sys_write()会调用显示器的驱动,让驱动显示出我们的字符
:apple:Linux系统API
:one:应用层
:tornado:read,write,open,lseek,close等函数
-
-
-
:two:系统调用
-
-
-
:banana:中断系统调用
-
-
:fire:慢速系统调用直接退出,返回值是-1,errno是EINTR
:maple_leaf:解决
:one:sa_flags
:explode:SA_INTERRUPT不重启,SA_RESTART重启
-
-
-
:banana:可重入函数
-
-
:coffee:设计可重入函数的建议
:explode:不要使用全局变量,static变量,malloc,free,标准的io和使用可重用函数(在man 7 signal
中可以查)
-
-
:banana:函数
-
:two:fflush
:explode:如果printf()没有\n
,就不会马上输出.所以要fflush("%c");
:apple:gcc编译的4个过程
-
:explode:c文件=>(预处理器:展开头文件,宏替换,删除注释)新c文件=>(编译器)汇编文件=>(汇编器)二进制文件=>(连接)可执行文件
:pear:一些问题
:peach:时序竞态
-
:bread:在我们的sleep函数中,alarm(1);pause();
中,如果alarm(1)后1s事件内这个进程都没有CPU时间片,那么alarm发出的信号就会被放入未决信号集中.此时进程再次获得CPU时间片,它会先解决未决信号,之后再进入pause,这样一来这个进程就一直被挂起了
-
-
-
-
:lemon:数据类型
:one:size_t & ssize_t
:explode:前者是无符号整型,后者是有符号的
-
-