Unix编程(一)进程环境

1. mian函数

c程序总是从main函数开始执行,其原型是int main(int argc , char** argv);其中argc是命令行参数的数目,argv是指向各参数的指针所构成的数组。当内核执行C程序时,在电泳main函数之前先调用一个特殊的启动例程,可执行文件将此启动例程指定为程序的起始地址。启动例程从内核取的命令行参数和环境变量值,然后按上述方式调用main函数做好安排。

进程终止

有8种方式是进程终止,其中5种是正常终止:

  1. 从main函数返回;
  2. 调用exit;
  3. 调用_exit或_Exit;
  4. 最后一个线程从启动例程返回;
  5. 最后一个线程调用pthread_exit;
    异常终止有三种:
  6. 调用abort;
  7. 接到一个信号;
  8. 最后一个线程对取消请求做出响应;
    三个退出函数:
#include<stdlib.h>
void exit(int status);
void _Exit(int status);
#include<unistd.h>
void _exit(int status);

如果调用这些函数是不带终止状态,或者main函数执行了一个无返回的return语句,或 main函数没有声明返回类型为整型,则该进程终止状态是未定的。但是,若面的函数返回类型是整型,并且执行到最后一条语句时返回,那么该进程的终止状态是0;
一张图说明c函数的启动和终止:c程序的启动和终止

c程序的存储空间布局 :

先来看一看一个程序的内存空间图
典型的存储空间安排

  1. 正文段(代码段)由CPU执行的机器指令部分。可共享,只读。
  2. 初始化数据段(静态变量和常量区),它包含了程序中需明确赋初值的变量。只初始化一次。
  3. 未初始化数据段。即在运行时改变其值,如 int sum[100];
  4. 栈。由编译器自动分配释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。每当一个函数被调用,该函数返回地址和一些关于调用的信息,比如某些寄存器的内容,被存储到栈区。然后这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,这就是C实现函数递归调用的方法。每执行一次递归函数调用,一个新的栈框架就会被使用,这样这个新实例栈里的变量就不会和该函数的另一个实例栈里面的变量混淆。
  5. 堆(heap)。用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。

存储空间分配:

三个空间分配函数:
1. malloc,分配指定字节数的存储空间。此区域中的初始值不确定。
2. calloc,为指定长度的对象分配存储空间。该空间的每一个bit位都初始化为0。
3. realloc,增加或减少以前分配的长度。当长度增加时,可能将以前分配的空间数据移动到新的大空间区域,以便在尾部添加新手,而新增空间的初始值是不确定的。

#include<stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);
//以上三个函数返回值:若成功返回空指针;若出错返回NULL;
void free(void *ptr);//释放空间函数

一个特殊的空间分配函数alloca,它的调用和malloc相同,但是他是在当前函数栈帧上分配空间,而不是在堆中。
优点:当函数返回时自动释放它申请的内存空间,所以不用担心内存泄漏;
缺点:alloca增加了栈帧的长度,而某些系统在函数调用后不能增加栈帧的长度,于是也就不支持alloca函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值