拾遗:Unix/Linux C_00
零、UNIX 标准:ISO C、IEEE POSIX、Single UNIX Specification
- XSI:X/OPEN System Interface
- Open Group 拥有 UNIX 商标,只有遵循 XSI 的实现才能称为 UNIX
- SUS(Single UNIX Specification) 是 Open Group 的出版物,Open Group 诞生于 1996 年,由 X/Open 和 OSF 合并而成
一、GCC
- gcc -I dir:添加头文件目录;
- gcc -L dir:添加库文件目录;
- gcc -o prog prog.c:指定编译结果的文件名称;
- gcc -c:只编译,不链接;
- lib*.a:传统静态库文件(gcc -o xxx xxx.c /PATH/TO/lib*.a 或 gcc -o xxx xxx.c -l*);
- lib*.so.N:动态库文件(gcc -o xxx xxx.c /PATH/TO/lib*.so.N 或 gcc -o xxx xxx.c -L /PATH -l*),指定路径或“-lm”形式均可;
二、header files
- 头文件仅包含函数的声明,不包含任何可执行代码;其作用是指明需要链接的库文件;库文件通常是只编译但未链接的一个个单功能模块;
三、static library
- 编写单独的函数文件(即不包含main(){}),使用gcc -c生成 object module;
- 使用 ar crv libfoo.a xx.o xy.o 生成静态库文件libfoo.a(即文件打包),用 ranlib libfoo.a 创建内置文件目录(GCC可选,BSD系统需要),使用 nm -s 查看打包文件详情;
四、shared library
- ldd prog:显示程序用到的动态库;
- ldconfig -v:修改动态库配置文件 /etc/ld.so.conf 后,使新文件生效;
- gcc -shared xxx.o:将.o文件转化成动态库;
五、linux kernel的职责
- 进程调度;
- 内存管理;
- 提供文件系统;
- 创建与终止进程;
- 对设备的访问;
- 联网;
- 提供系统调用应用程序接口(API);
- 提供多用户操作空间(vitual private computer);
六、进程终止和终止状态
- 进程可使用_exit()系统调用或exit()相关的库函数请求退出,也可向进程传递信号,将其终止;两种方式均会生成终止状态,一个非负小整数,供父进程的wait()系统调用检测;
- C库函数是对系统调用的更上一层抽象,fopen()、fclose()、fread()、fwrite()、fgets()、fputs()、remove()等是基于open()、close()、read()、write()、ioctl()、unlink()、rmdir()等系统调用之上构建的;系统调用本身会占用硬件资源;Linux系统调用层面不存在文本概念,一切均是二进制,系统本质上只提供一种文件系统——字节流;
七、杂项
- 进程可使用setrlimit()系统调用为自身设置资源占用上限——soft limit、hard limit;
- kill对应的底层系统调用为kill(),程序可以选择不采取默认的信号动作,如:忽略信号(-9信号必然执行)、屏蔽信号或建立自己的信号处理器;
- 多线程通过全局变量或IPC共享数据;多线程更能发挥多处理器的性能;
- 用户空间:进程的虚拟地址空间;
- C语言的系统调用通过wrapper函数实现;设计库函数是为了提供比底层系统调用更方便的调用接口;
- strace命令可追踪程序的系统调用过程,用于调试程序或研究程序的运作机制;
- 标准库函数getopt()、getopt_long()用于解析命令行参数;
八、进程间通信(IPC)
- 信号signal,形式:SIGxxxx;
- 管道pipe;
- BSD套接字socket;system V FIFO;
- 文件锁定file lock;
- 消息队列MESSAGE QUEUE;
- system V信号量semaphore;
- 共享内存shared memory;
九、进程组(会话、任务)
- 会话中所有会话都具有相同的会话标识符,首进程(session leader)的PID会成为会话ID;
- 会话可以包含多个进程组;
- 一个会话对应一个控制终端;
- 使用会话最多的是支持任务控制的shell,由shell创建的所有进程与shell自身隶属于同一会话,shell是此会话的首进程;
十、日期和时间
- 自1970-01-01 00:00:00起的秒数(需要进行时区调整),即国际协调时间,简称为UTC;
- 系统cpu时间,指系统调用或其它内核服务的耗时;用户cpu时间,指执行常规的程序代码耗时;
十一、实时性realtime
- 操作系统或应用程序具备的即时响应能力,用以满足银行ATM、飞机导航系统等场景的需求;
- unix/linux支持实时性的策略:异步I/O、共享内存、内存映射文件、内存锁定、实时性时钟和定时器、备选调度策略、实时性信号、消息队列以及信号量等
十二、查看glibc版本
- ldd prog | grep libc可查看glibc的路径,执行/PATH/TO/libc.so.N可显示详细版本信息;
- 调用函数gnu_get_libc_version(),返回一个诸如“2.12”的字符串指针;#include <gnu/libc-version.h>;
十三、调用error
- 系统调用或C库调用,必须检查返回状态,通常返回-1表示出错;getpid()、_exit()等少数几个调用不会出错,可以不检查;
- 系统调用失败时,会将全局int变量errno设置为一个正值,以标识具体的错误;#include <errno.h>;
- errno不会被自动重置为0,其负值状态可能是之前调用失败造成的;
- 进行错误检查时,首先检查函数的返回值是否表明调用出错,然后再通过errno确定出错的原因;
- 库函数perror()与strerror()可用于根据errno的值,返回系统调用或部分库函数调用的错误信息,返指值是一个字符串指针;
- 调用库函数的错误状态返回方式各有不同,需要参阅对应的man手册;
十四、exit()与return()
- exit()包含在stdlib.h头文件中,用于直接退出程序;
- return()用于退出所在函数;
HADEX_ FROM HELL.