关键字:main函数运行、程序终止和回调注册、环境变量与环境表、c程序存储空间布局、longjmp、资源限制
- main函数调用的实现是c编译器帮忙实现的,c编译器在我们的main函数之前加入了内置好的启动程序,这个启动程序从内核取得命令行参数和环境变量。启动程序如果用c代码类似如下这样:
exit(main(argc, argv))
但一般启动程序使用汇编编写
-
进程退出的8种方式
- exit(0)等价于return(0)
- atexit可以用来注册exit handler,本质就是注册程序结束前需要执行的回调函数,需要注意的是:函数注册顺序与执行顺序相反;同一函数注册多次,那么也会执行多次
- 内核使程序执行的唯一方法是调用一个exec函数,进程自愿终止的唯一方法是执行exit系列的函数
- ISO C 和 POSIX.1都要求argv[argc]为一个空指针
- environ全局变量保存所有的环境变量,但是一般使用getenv和putenv函数操作环境变量。environ指向一张环境表
- size命令可以报告正文段,数据段和bss段的长度,dec和hex分别为十进制和是十六进制的三段的总长度
[root@localhost include]# size /bin/sh
text data bss dec hex filename
903323 35984 22920 962227 eaeb3 /bin/sh
- setjmp/longjmp,支持跨函数返回,抛弃当前栈帧,恢复setjmp时的栈状态
- longjump跳转时,只有volatile变量不会恢复到之前的值,所以在这个场景,可移植程序必须使用volatile变量
- 自动变量的潜在问题:栈上分配的临时变量在返回后不能继续使用,如果要实现这种需求,需要指定为全局变量或者在堆上分配
- 资源限制影响到调用进程并由子进程继承,这就意味着,为了影响一个用户的所有后续进程,需将资源限制的设置构造在shell之中(ulimit命令,getrlimit和setrlimit方法)