1. main函数:int main(int argc, char* argv[]),调用main函数前系统先调用一个特殊的启动例程,它从内核取得命令行参数和环境变量值,为调用main函数做好安排。
2. 进程终止方式8种,5种正常终止:
a) main 函数return
b) 调用exit
c) 调用_exit或_Exit
d) 最后一个线程从其启动例程返回
e) 最后一个线程调用pthread_exit
异常终止3种方式
a) 调用abort
b) 接到信号并终止
c) 最后一个线程对取消请求做出响应
3. _exit和_Exit会立即进入内核,exit先执行一些清理处理(包括调用执行各终止处理程序(由atexit或on_exit注册,先登记后调用(栈式规则)),关闭所有标准I/O流等),然后进入内核。
4. 由atexit或on_exit注册的函数,在exit或return退出时,都会执行。
5. 环境表指针:extern char **environ,多个字符串,形如”HOME=/home/sar\0”
6. C程序存储空间从低地址到高地址为
a) 正文段
b) 初始化数据段
c) BSS段(block started by symbol)
d) 堆
e) 栈
7. size命令查看程序文件text、data、bss段大小
8. 动态库的优点:减小可执行文件的大小,缺点是增加第一次调用共享库函数时的时间开销;另一个优点是动态库升级之后,可以不必重新连接编辑(只要API不变)
9. 内存分配:堆上动态分配内存时,多数的实现中,所分配的存储空间比要求的要大一些,位于该块的前端,保存管理信息,这就意味着这些内存一旦被越界误写,会造成灾难性后果。
10. Malloc\calloc\realloc\free:
a) malloc不清零、calloc会清零,
b) free只能处理前三个函数返回的指针,不能重复free
c) realloc可以动态改变申请内存大小。
11. alloca:类似malloc的使用方法,但是分配的空间在栈帧,所以会自动释放。
12. 获取环境变量:char *getenv(const char *name);
13. Linux支持对环境变量相关的API: getenv、putenv、setenv、unsetenv、clearenv
14. 跨越函数的跳转:setjump和longjump