[APUE]UNIX进程的环境(上)
一、 前言
本章将学习:当执行程序时,其main函数是如何被调用的,命令行参数是如何传送给执行程序的,典型的存储器布局是什么样式,如何分配另外的存储空间,进程如何使用环境变量,进程终止的不同方式等。另外还将说明longjmp和setjmp函数以及它们与栈的交互作用。
二、 main函数
C程序的入口是main函数,main函数的原型是:
int main(int argc, char argv[]);
当内核启动C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程制定为程序的起始地址--这是由链接器设置的,而链接器程序则由C编译程序(通常是cc)调用。启动例程从内核取得命令行参数和环境变量值,然后为调用main函数作好安排。
三、进程终止
有五种方式使进程终止:
正常终止: (a) 从main返回。
(b) 调用exit。
(c) 调用_exit。异常终止: (a) 调用abort。
(b) 由一个信号终止。
上节提到的启动例程是这样编写的,使得从main返回后立即调用exit函数,如果将启动历程以C代码形式表示(此例程通常用汇编编写),则它调用main函数的形式可能是: exit(main(argc, argv));
1. exit和_exit函数
exit和_exit函数用于正常终止一个程序:_exit立即进入内核,exit则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准IO流等),然后进入内核。
#include <stdlib.h>
void exit(int status);
#include <unistd.h>
void _exit(int statu);
使用不同头文件的原因是:exit是由ANSI C说明的,而_exit则是由POSIX.1说明的
由于历史原因,exit函数总是执行一个标准IO库的清除关闭操作:对所有打开的流调用fclose函数,这会造成缓存中的所有数据都被刷新(写入到文件上)。
2. atexit函数
按照ANSI C的规定,一个进程可以登记多至32个的终止处理函数(exit handler),这些函数将由exit自动调用。可用atexit函数来注册这些函数。
#include <stdlib.h>
int atexit(void (*func)(void));
返回值:成功为0,出错非0
atexit的参数是一个无参数并且无返回的函数的指针。exit以注册这些函数的相反顺序调用它们。如果一个函数被注册多次那会被调用多次。 根据ANSI C和POSIX.1 exit首先调用各终止处理程序,然后按需多次调用fclose。下图显示了一个C程序是如何启动的,以及它终止的各种方式。

内核使程序执行的唯一方式是调用一个exec函数。
四、命令行参数
当执行一个程序时,调用exec的进程可将命令行参数传给该程序。
五、环境表
每个程序都接收到一张环境表。与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的字符串的地址。全局变量environ则包含了该指针数组的地址。 extern char **environ; 如果该环境包含五个字符串,那么它们看起来如下图:

其中每个字符串的结束处都有一个null字符。我们称environ为环境指针。指针数组为环境表,其中各指针指向的字符串为环境字符串。通常使用getenv和putenv函数来存取特定的环境变量,而不是用environ变量。但是如果要查看整个环境则必须使用environ指针。
六、C程序的存储空间布局
C程序由以下几部分组成:
- 正文段。这是由CPU执行的机器指令部分。通常正文段是共享的,所以即使是经常执行的程序(如文本编辑程序、C编译程序、shell等)在存储器中也只需有一个副本。另外正文段常常是只读的。
- 初始化数据段。通常将此段称为数据段。其中包含了程序中需赋初值的变量。如C程序中任何函数之外的说明:
int maxcount = 99;使此变量以初值存放在初始化数据段中。
- 非初始化数据段。通常称此段为bss段(block started by symbol, 由符号开始的块),在程序开始执行之前,内核将此段初始化为0。函数外的说明:
long sum[1000]使此变量存放在非初始化数据段中。 - 栈。自动变量以及每次函数调用所需保存的信息(返回地址和调用者的环境信息)都存放在此段中。
- 堆。通常在堆中进行动态存储分配。堆位于非初始化数据段项和栈底之间。
下图显示了这些段的典型安排方式。
从图中可以看到未初始化数据段的内容并不存放在磁盘程序文件中。需要存放在磁盘程序文件中的段只有正文段和初始化数据段。size命令报告正文段、数据段、和bss段的长度:
$ size /bin/cc /bin/sh
text data bss dec hex
81920 16384 664 98968 18298 /bin/cc
90112 16384 0 106496 1a000 /bin/sh
第4列和第5列分别以十进制和十六进制表示的总长度。
[APUE]UNIX进程的环境(上)的更多相关文章
- [APUE]UNIX进程的环境(下)
一.共享库 共享库使得可执行文件中不再需要包含常用的库函数,而只需在所有进程都可存取的存储区中保存这种库例程的一个副本.程序第一次执行的时候或第一次调用某个库函数的时候,用动态链接方法将程序与共享库函 ...
- unix进程通信方式总结(上)(转)
本文将<unix环境高级编程>一书中所涉及的几种重要的进程间通信方式(Inter-Process Communication)进行简单总结,总的来说,进程间通信有以下几种: ...
- unix进程的环境--unix环境高级编程读书笔记
http://blog.csdn.net/xiaocainiaoshangxiao/article/category/1800937
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- APUE(unix环境高级编程)第三版---first day---部署书中实例的运行环境(apue.h)
操作环境:RHEL7.0 部署apue.h实例运行环境 1.下载头文件src.3e.tar.gz 2.解压 tar zxvf src.3e.tar.gz 3.创建普通用户(我仿照书上创建的sar用户) ...
- unix进程通信方式总结(中)(转)
在上一篇博客http://blog.csdn.net/caoyan_12727/article/details/52049417已经总结了<<uinx环境高级编程>>进程通信前 ...
- [Oracle]UNIX与Windows 2000上Oracle的差异(I)
作者:Ian Adam & David Stien, SAIC Ltd 日期:19-Dec-2003 出处:http://www.dbanotes.net翻译:Fenng ---------- ...
随机推荐
- Hangfire项目实践分享
Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...
- Xcode模拟器启动不了,修复ios模拟器
1.如果可以重置模拟器 首先试试重置模拟器 2.如果不能重置,可以选择使用如下命令杀死模拟器服务: killall -9 com.apple.CoreSimulator.CoreSimulatorSe ...
- 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。
前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...
- jQuery动画-圣诞节礼物
▓▓▓▓▓▓ 大致介绍 下午看到了一个送圣诞礼物的小动画,正好要快到圣诞节了,就动手模仿并改进了一些小问题 原地址:花式轮播----圣诞礼物传送 思路:动画中一共有五个礼物,他们平均分布在屏幕中,设置 ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- CSS3 @keyframes 动画
CSS3的@keyframes,它可以取代许多网页动画图像,Flash动画,和JAVAScripts. CSS3的动画属性 下面的表格列出了 @keyframes 规则和所有动画属性: 浏览器支持 表 ...
- BPM任务管理解决方案分享
一.方案概述任务是企业管理者很多意志的直接体现,对于非常规性事务较多的企业,经常存在各类公司下达的各种任务跟进难.监控难等问题,任务不是完成效果不理解,就是时间超期,甚至很多公司管理层下达的任务都不了 ...
- VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容
VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容 一般来说,在对虚拟机里的Ubuntu下的磁盘进行扩容时,都是添加新的分区,而并不是对其系统所在分区进行扩容,如在此链接中http ...
- Xamarin体验:使用C#开发iOS/Android应用
Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 简介 Xamarin是基于Mo ...