APUE读书笔记(9) 进程环境

第七章 进程环境

一:主要内容:
  本章主要介绍进程环境,主要包括程序执行时,main函数的调用过程;命令行参数的传递;典型的存储空间的布局等等。
二:main函数
  C程序从main函数开始执行,其原型为

  其中argc为命令行参数的个数,argv是一个字符串指针数组,表示各参数内容。在调用main函数之前会启动一个特殊的例程,可执行文件将启动例程指定为程序的起始地址。
三:进程终止
  进程终止的方式有八种,其中有五种正常终止和三种异常终止:
在这里插入图片描述
四:命令行参数
  在执行一个程序的时候,会遇到传入可执行参数的情况,这时我们可以通过argv和argc来对传入的参数进行打印,打印程序可以是如下的形式:
在这里插入图片描述
  上述程序的作用就是循环遍历argc次,每次都把argv指针数组中的第i个打印出来。
五:环境表
  每个程序都会接收到一个环境表,和参数表类似,环境表也是一个字符串指针数组,全局变量environ包含了这个数组的地址:extern char **environ
  例如,如果该环境包含了五个字符串,其形式如下:
在这里插入图片描述
  大多数的预定义名完全由大写字母组成,但是这个只是一个惯例。在历史中,大多数的UNIX系统支持main函数的三个参数,其中第三个就是环境表地址。
六:C程序的存储空间分布
  历史沿袭至今,C程序一直由以下部分组成:
  正文段。这是由CPU执行的机器指令部分,通常,正文段是可以共享的,所以即使是频繁的执行的程序在存储器中也只有一个副本。一般正文段只是只读的,这是为了防止程序由于不确定因素修改其指令。
  初始化数据段,一般简称为数据段,包含了程序中需要明确赋值初值的变量。或者叫全局变量。
  未初始化数据段,也叫bss段,在程序开始执行前,内核会将此段中的数据自动初始化为0或者空指针。
  栈,存储自动变量以及函数调用时所需要保存的信息。通过这种方式C程序的递归函数可以工作,每次调用自身时会使用一个新的栈帧, 因此递归函数的变量不会发生影响。
  堆,通过动态存储分配。
  一般这些部分的逻辑布局如下:
在这里插入图片描述
七:共享库
  共享库就是动态编译,使得程序中可以不需要包含公用的函数库,仅在存储区中保存一个副本就可以了。虽然减少了可执行文件的长度,但是在程序运行的时候会增加时间开销,这个时间开销主要发生在该程序第一个被执行时。
八:存储空间分配
  主要就是malloc,calloc和realloc,对应的销毁空间由free,这里不详细介绍了。
九:函数setjmp和longjmp
  这两个函数的作用是用来做函数间的跳转,goto也有类似的功能不过仅能进行本函数内的跳转。对于函数间的跳转,可以使用这两个函数,不过由于跳转后不一定能够回滚原来的变量值,所以这个会增加程序的不确定性,我个人是不推荐使用这两个函数的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值