本章主要介绍进程的环境
函数执行时, main函数是如何被调用的,命令行参数是如何传递给新程序, 典型的存储空间布局, 如何分配额外的存储空间, 进程如何使用环境变量, 进程的各种不同的终止方式, 另外学习 longjump
和setjump
和栈的交互.
进程环境
本章主要介绍进程的环境
函数执行时, main函数是如何被调用的,命令行参数是如何传递给新程序, 典型的存储空间布局, 如何分配额外的存储空间, 进程如何使用环境变量, 进程的各种不同的终止方式, 另外学习 longjump
和setjump
和栈的交互.
mian函数
1 | int main(int argc, char * argv[]); |
当内核执行C程序时, 使用一个exec函数
, 在调用一个特殊的启动例程,后调用 main 函数. 可执行程序文件将此启动例程指定为程序的起始地址– 连接编辑器 设置的.
启动例程从内核中获得命令行参数和环境变量. 然后按上述方式调用main函数
进程的终止
8种termination的方式.
todo 图片
退出函数
1 |
|
atexit 退出函数注册函数
1 |
|
调用顺序与登记顺序相反
最多32个
如果缓冲区种还有数据, 调用exit,如果是行缓冲的数据,可能打印不出来, 就直接exit掉.
stdout是行缓冲的, 记得\n
命令行参数
1 | argv |
环境表
环境指针, 环境字符串
C 程序的存储空间布局
正文
初始化数据
int maxcount = 1000;
未初始化数据
long sum[100];
栈
堆
size 命令
报告
1 | ➜ chap7 size /usr/bin/zsh |
共享库
1 | ➜ chap7 gcc atexit_test.c -g -o o.atexit |
符号链接不影响上述段的大小,因为上述段在内存中
1 | ➜ chap7 gcc atexit_test.c -o s.no.atexit |
存储空间的分配
1 |
|
malloc
返回的指针是适当对齐的
calloc
为指定数量指定长度的对象分配存储空间.
realloc
可能会移动分区.
记得free
环境变量
1 |
|
用户可以改环境变量但是,只对自己有用.
除非
1 | int putenv(char *str); |
环境字符串存在与存储空间顶部, 栈之上..
环境字符串修改起来很麻烦
1 | ➜ chap7 cat env.c |
函数 setjmp和longjmp
setjmp
和 longjmp
可以跨越函数
比较复杂, 挖坑,待填
函数 getrlimit 和 setrlimit
习题
7.1
如果未执行return或exit . 返回值未定义
7.2
stdout
采用行缓冲, 在遇到\n
或者强制 fflush
或者调用exit 正常退出的情况下, 会真正输出.
7.3 ? longjump?