提问形式复习进程环境的相关知识点
原文链接:http://blog.csdn.net/feather_wch/article/details/50722815
C程序是有kernel调用exec程序之一来调用的。在main函数之前存在着特殊的启动函数(start-up)。启动函数被设置为程序的开始地址。这是由link editor
设置的。
用于从kernel(内核)获得一些值,如获得了命令行参数(command-line argument)和环境(environment)
一般的终止方式:
1. 从main return
2. 调用exit
3. 调用_Exit, _exit
4. 开始程序的最后一个线程 return
5. 在最后一个线程调用 pthread_exit
异常的终止方式:
6. 调用abort
7. 接收到信号
8. Response of the last thread to a cancellation request(11.5 and 12.7)
exit会先进行清除工作,再返回到kernel(例如会调用fclose关系所有打开的流,所有缓冲的输出数据都会flush)
_exit, _Exit会立即返回到kernel
Exit handler:就是exit自动调用的函数
可以通过atexit
进行注册。
内核通过exec执行程序,程序第一段执行的内容是C启动程序,该启动程序用于从kernel获得命令行参数和环境,然后启动程序调用main执行。结束的时候,可以通过_exit和_Exit直接返回kernel;也可以通过调用exit来调用exit handlers进行相应的清理工作,最后再返回kernel
字符指针的数组
environ是全局变量
共享库移除了可执行文件中共同的库程序(library routines),在内存中存放着library routine的copy,任何进程都可以调用。
优点:1. 减少可执行文件的尺寸 2. 库程序可以直接用新版本替换,而不需要重新连接每个使用该库的程序(前提是:参数类型和数量不变)
缺点:程序第一次调用,或者该库程序第一次调用的时候,会有额外的时间消耗
malloc/calloc/realloc/alloca
malloc
是从heap
分配的空间
alloca
是从当前函数的stack frame
分配的空间
优点:能自动释放空间
缺点:一些系统不支持alloca
,这样的系统调用alloca
无作用
环境字符串例如name=value的形式,例如环境变量HOME 和 USER
HOME or USER 在登陆时自动被设置
可以在shell的启动文件里面设置环境变量来控制shell的操作
又如环境变量MAILPATH能告知shell哪里能找到mail
链接7.9:http://blog.csdn.net/feather_wch/article/details/50740004
见链接7.9
见链接7.9
每个function中的自动变量都保存在stack frame中
系统内部并有没有支持stack的硬件,C的实现可能会使用链表来实现stack frames
在不同function之间实现goto label的功能。
变量为volatile
变量或者static变量
volatile
自动变量被释放后,依然会被引用,比如函数返回了内部变量的地址。
系统资源限制是系统启动时由进程0
设置的,且由后续的进程继承。