Ch 7 进程环境
启动例程: exit ( main (argc, argv) )
进程终止方式
正常终止:
- 从 main 返回
- 调用 exit,_exit,_Exit
- 最后一个线程从其启动例程返回
- 从最后一个线程调用 pthread_exit
异常终止:
- 调用 abort
- 接到一个信号(例如除0)
- 最后一个线程对取消请求做出相应
exit
exit() 会先调用终止处理程序,然后关闭所有打开流
atexit() 可以注册多至 32 个函数,实际实现中可能会支持更多 内核使程序执行的唯一方法是调用 exec 函数,进程自愿终止的唯一方法是显式或隐式调用 exit,也可以非自愿地由一个信号使其终止
环境变量
环境变量可以通过查环境表的方式找到 environ 为环境指针,指向一个以 NULL 结尾的字符串,每个 KV 对用 \0 分隔开, K=V \0 K=V 来表示
使用 getenv 和 putenv 也可以访问 设置环境变量只是影响当前进程及其生成和调用的任何子进程的环境 unsetenv | clearenv 因为环境表在进程中的排布,在增加的时候不能进行向上或向下扩展。如果需要增加新的变量,那么必须使用 malloc 分配指针表,并把原来的环境表拷贝到新分配的空间中,如果不是第一次增加,那么使用 remalloc 分配比原空间多一个指针的空间,再存
程序空间布局
高
命令行参数和环境变量
栈
堆
未初始化数据(bss)
初始化数据 — exec 从程序文件读入
程序正文 — exec 从程序文件读入
低
存储空间分配
malloc 分配指定字节数的存储区,存储区初始值不确定 calloc 为指定数量指定长度的对象分配存储空间,每一位都初始为 0 realloc 增加或减少已经分配区域的长度,可能追加,也可能会触发重新的分配和拷贝
free 释放指针指向的存储空间,被释放的空间通常被送回可用存储区池
上述的函数通常使用 sbrk() 实现,扩充收缩堆 大多数实现所分配的存储空间比所要求的要稍大一点,额外的空间用来记录管理信息,分配块的长度和指向洗衣歌分配块的指针
内存泄露:调用 malloc 但却忘记调用 free 函数,那么进程占用的存储空间就会连续增加,直至不再有空闲空间,换页开销会导致性能的下降
函数 setjmp 和 longjmp
goto 的跳转不能跨越函数 setjmp 和 longjmp 可以处理发生在很深层嵌套的函数调用中的出错情况 希望返回到的位置调用 setjmp 使用一个全局变量来帮助记录和恢复栈状态的所有信息 因为一个 setjmp 可以对应多个 longjmp,因此用不同的返回值来确定是从哪个 longjmp 跳回来的。本质是跳回的时候抛弃已经嵌套的栈帧并对栈重新覆写