进程环境

1.main函数

C程序总是从main函数开始执行,原型是

int main(int argc, char *argv[]);

当内核执行C程序时(使用一个exec函数),在调用main函数前先调用一个特殊的启动例程。可执行文件将此启动例程指定为程序的起始地址(这是连接编译器设置的,而连接编译器则由C编译器(CC)调用。启动例程从内核取得命令行参数和环境变量值),然后执行main。

启动例程的C代码表现形式:

exit(main(argc, argv));

 

2.进程终止

五种正常终止:

1). 从main返回

2). 调用exit

3). 调用_exit或_Exit

4). 最后一个线程从启动例程返回

5). 最后一个线程调用pthead_exit

三种异常终止

1). 调用abort

2). 接到一个信号并终止

3). 最后一个线程对取消请求做出响应

    2.1. exit函数

    有三个函数用于正常终止一个程序:_exit和_Exit立即进入内核,exit则先执行一些清理处理(调用个终止处理程序,关闭所有标准I/O流等),然后进入内核。

void exit(int status); //include <stdlib.h>

void _Eexit(int status); //include <stdlib.h>

void _exit(int status); //include <stdlib.h>

三个exit函数都带一个整型参数,这个叫终止状态(或推出状态,exit status)。如果调用这些函数时不带终止状态,或main执行了一个无返回值的return语句,或main没有声明返回类型为整型,则该进程的终止状态是没有定义的。

    2.2. atexit函数

    按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用。这些函数称为终止处理程序(exit handler),并调用atexit函数来登记。

int atexit(void (*func)(void)); //include <stdlib.h>

其中,atexit的参数是一个函数地址,当调用该函数无需向它传送任何参数,也不能期望它返回一个值。exit调用这些函数的顺序与它们登记时候的顺序相反。同一函数如登记多次,就会被调用多次。

 

3. 命令行参数

ISO和POSIX.1都要求argv[argc]是一个空指针,所以我们对参数的循环处理可以写为

for(i =  0; argv[i] != NULL; i++)

  

4. 环境表

每个程序都会收到一张环境表,它是一个字符串指针数组,其中每个指针包含一个以null结束的C字符串的地址。

extern char **environ;

 

5. C程序的存储空间布局

正文段——这是由CPU执行的机器指令部分。通常,正文段是可以共享的,是只读的。

初始化数据段——通常称为数据段。

未初始化数据段——通常称为bss段(block started by symbol, 由符号开始的块)。

栈——自动变量以及每次函数调用时所需保存的信息(调用函数返回地址和调用者的环境信息)都存在此段中。被调用函数的临时变量也在栈上分配空间。递归函数每次调用都会使用一个新的栈帧。

堆——通常用来进行动态存储分配。位于非初始化数据段和栈之间。

 

6. 共享库

共享库使得可执行文件不再需要包含公用的库例程,而只需要在所有进程都可以引用的存储区维护这种库例程的一个副本。优点:节省了存储空间;提高了效率;只要参数的数目和类型不变,共享库更新时,不需要程序重新编译链接。

    

7. 存储器分配

ISO C说明了三个用于存储空间动态分配的函数。它们是malloc,calloc和realloc函数。使用时可能产生的致命性错误是:释放了一个已经释放了的块;调用free时所用指针不是三个alloc的返回值。如果一个进程调用了malloc函数,却忘记调用了free函数,这会产生内存泄露。进程的地址空间长度就会慢慢增加,直至没有空余空间。此时由于过度的分页开销,因而是性能下降。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值