这一章内容是Process的基础准备篇章。这一章的内容都是基于C Programm为例子。函数
(一)进程开始:spa
kernel → C start-up rountine → main functionorm
其中C start-up rountine作的事情中包括:得到command-line arguments & environment进程
好像还有其余的事情,后面再说。ip
(二)进程结束:资源
五种normal termination方式:作用域
1. return from main字符串
2. exitget
3. _exit _Exitit
4. 从start routine调用的last pthread里面return
5. 在最后一个pthread中调用pthread_exit
三种abnormal termination方式:(这三种方式先不学)
1. abort
2. receipt of a signal
3. response of the last pthread to a cancellation request
注册进程退出时执行“钩子函数”:atexit
基于stack结构实现的,因此用atexit注册的函数在进程exit的时候是reverse order执行的(跟Chapter11提到的进程清理函数也相似)
这部分的代码比较直观,看书上P202 Figure7.3代码便可。
APUE 英文3版201页Figure7.2是个比较综合的图,很好阐述了进程开始和结束的各类路径以及作的事情:
简单来讲:
1. return或exit :先调用各类exit handler以及standard I/O cleanup;再调用_exit或_Exit
2. 若是是直接_exit或_Exit就直接强行退出进程,一步到位,不会调用各类exit handler和Cleanup等了
(三)Command-Line Arguments
没有什么特别解释的 就是main传入两个参数:
1. int argc:参数个数
2. char *argv[]:以字符串形式传入的参数
argv[0]永远是命令自己,从argv[1]开始是真正传入程序的参数
(四)Environment List
以前main的参数中是有这个的;可是后来发现这东西的用途太多了,地位就升级了,就给他专门搞了一些内置的函数去操做
(五)Memory Layout of a C program
重点都在P206的Figure7.6上面。
地址由高到低依次是:
第一部分:Command-Line arguments & environment variables
第二部分:stack(栈)(调用函数的stack frame在这里,函数返回以后,这部分资源就可能瞬间被其余内容覆盖了)
第三部分:留白 (stack能够向下grow,占用这块留白;heap能够向上grow,占用这块留白)
第四部分:heap(堆)(提供动态分配的空间:malloc;若是忘了free,就memory leak了)
第五部分:uninitialized data (没有初始化的全局变量)
第六部分:initialized data (初始化的全局变量)
第七部分:text segment(包括CPU可执行的machine instructions)
其中,只有6、七两部分是存在于program file中的;五貌似也像在program file中的,其实不是的,是由kernel设置为0的。
(六)Shared Libraries、(七)Memory Allocation留之后用到再看
(八)Environment Variables
因为Environment Variables的地位提升了,所以有三个函数能够改环境变量:
1. putenv
2. setenv
3. unsetenv
这里有两点须要注意下:
1. 就是这个简单的Environment Variables,为何要搞这样几个复杂的函数去设置、修改?回想Memory Layout of a C program,最上面那块大小是定死的:若是EV比原来短还好,比原来长,或者动态增长,就须要利用heap空间了。这就涉及到一些麻烦事情。详情书上写的挺好。
2. 进程中设定EV的做用域:在当前进程设置的EV,只对当前进程以及其子进程有效,不影响其余进程。
(九)setjmp和longjmp
代码都在书上,很直观就不粘上来了。
Goto是在同一个函数中跳转(某个stack frame内);setjmp和longjmp负责在一个进程的函数间跳(夸若干个stack frame)
有几点须要注意:
1. setjmp设定跳回到哪,longjmp负责跳,用jmp_buf类型的变量来协调两者,跳到哪。
2. 通一个setjmp能够从不一样地方longjmp回来
3. f1() { setjmp; f2(){f3(longjmp;)}} 若是从f3中跳回f1,则stack中f2和f3的stack frame都无效了(即不归f2和f3是换了,可能迅速被其余占用了)
4. 仍是3中的例子,若是longjmp回到f1中了,那么f1中变量的状态呢?受到执行完f1和f2以后的影响,仍是保存以前的状态呢?答案是不必定,尤为是autmatic register变量,更是不必定了。这里比较好的办法是,把变量设成volatile的,这样即便longjmp回来,变量确定是受到f2和f3的影响后的值,不会出现不肯定状态
(十)getrlimit & setrlimit
涉及到进程占用资源的分配,后面再看。