本文是笔者拜读《UNIX环境高级编程》第7章(进程环境)的学习笔记。本文的主要内容包括进程终止、环境表、C程序存储空间、共享库、存储空间分配、跳转。
目录
main函数
C
程序总是从main
函数开始执行,main
函数的原型是:
int main(int argc, char **argv);
argc
是命令行参数的数目,argv
是指向参数的各个指针所构成的数组。
当内核使用一个exec
函数执行C
程序时,在调用main
前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址,启动例程从内核取得命令行参数和环境变量值,然后为调用main
函数做好安排。
进程终止
正常终止:
(1)从main
返回。
(2)调用exit
。
(3)调用_exit
或_Exit
。
(4)最后一个线程从其启动例程返回。
(5)从最后一个线程调用pthread_exit
。
异常终止:
(1)调用abort
。
(2)接到一个信号。
(3)最后一个线程对取消请求做出响应。
如果将启动例程以C
代码形式表示,则它调用main函数的形式可能是:
exit(main(argc, argv));
退出函数
_exit
和_Exit
立即进入内核,exit
则先执行一些清理,如对所有打开流调用fclose函数、冲洗缓冲区,然后返回内核。
3
个退出函数都带一个整型参数,称为终止状态(退出状态)。在main
函数中exit(0);
等价于return 0;
函数atexit
一个进程可以登记多至32
个函数,登记函数(终止处理程序)由exit
自动调用,使用atexit
函数登记终止处理程序。
exit
调用这些函数的顺序与登记它们的顺序相反。如果同一函数被登记多次,也会被调用多次。
exit
首先调用各终止处理程序,然后关闭所有打开的流。如果程序调用exec
函数族中的任一函数,则将清除所有已安装的终止处理程序(调用了exec
的子进程不继承父进程的终止处理程序)。
命令行参数
当执行一个程序时,调用exec
的进程可将命令行参数传递给新程序。
环境表
每个程序都接收到一张环境表。与参数表一样,环境表也是一个指针数组,每个指针指向一个C
字符串。全局变量environ
则包含了该指针数组的地址:
extern char **environ;