exec先调用启动例程,启动例程从内核取得命令行参数
退出函数
exit
_exit 或者_Exit
echo $? 获取函数(比如main函数)的返回值
exit会调用一些函数,称为终止处理程序,而atexit用来登记这些函数
内核使程序执行的唯一方法是调用一个exec函数
环境表
如下,为一堆键值对
空间分布,栈一般都在高处(Linux从0xC0000000开始),正文一般是CPU机器指令(linux从0x08048000开始),每次函数调用都会生成栈帧,我的理解是,一个函数调用对应一个栈帧
相关的linux命令如下:,其中text代表正文段,即CPU执行的机器指令
使用共享库的text,data,bss均大大减小,因为可执行文件不再需要包含公共的库函数(用户态函数,比如malloc)
data代表已经初始化的数据,比如函数体外的:
int maxlen = 100;
,bss代表未初始化的数据,比如函数体外的:
long a[1000];
root@ubun2004:/home/learnApue/apue.3e/environ# ./echoarg arg1 Test foo
argv[0]: ./echoarg
argv[1]: arg1
argv[2]: Test
argv[3]: foo
root@ubun2004:/home/learnApue/apue.3e# size /usr/bin/cc /bin/sh
text data bss dec hex filename
1131683 15176 15048 1161907 11bab3 /usr/bin/cc
114971 4856 11312 131139 20043 /bin/sh
root@ubun2004:/home/learnApue/apue.3e/environ# gcc -static doatexit.c //不使用共享库
root@ubun2004:/home/learnApue/apue.3e/environ# ls -l a.out
-rwxr-x--- 1 root root 876704 Sep 5 04:45 a.out
root@ubun2004:/home/learnApue/apue.3e/environ# size a.out //使用共享库
text data bss dec hex filename
764793 20996 6016 791805 c14fd a.out
root@ubun2004:/home/learnApue/apue.3e/environ# gcc doatexit.c
root@ubun2004:/home/learnApue/apue.3e/environ# ls -l a.out
-rwxr-x--- 1 root root 17568 Sep 5 04:45 a.out
root@ubun2004:/home/learnApue/apue.3e/environ# size a.out
text data bss dec hex filename
4908 688 48 5644 160c a.out
环境变量
getenv(name) 获取指定name的环境变量值
putenv/setenv 设置环境变量
unsetenv(name) 删除指定name环境变量的定义
看到unsetenv
open_data 7.11顶部,到底是哪里出了问题,IO的stdin和下一个调用函数,共同使用了同一个存储空间对吗,我觉得是的,这样才会冲突和混乱
函数getrlimit和setrlimit
软限制<=硬限制
总结
这一节,主要介绍了函数如何启动,函数调用的栈空间分配,环境变量,以及资源限制