这一章内容是Process的基础准备篇章。这一章的内容都是基于C Programm为例子。

(一)进程开始:

  kernel → C start-up rountine → main function

  其中C start-up rountine做的事情中包括:获得command-line arguments & environment

  好像还有其他的事情,后面再说。

(二)进程结束:

  五种normal termination方式:

    1. return from main

    2. exit

    3. _exit _Exit

    4. 从start routine调用的last pthread里面return

    5. 在最后一个pthread中调用pthread_exit

  三种abnormal termination方式:(这三种方式先不学)

    1. abort

    2. receipt of a signal

    3. response of the last pthread to a cancellation request

  注册进程退出时执行“钩子函数”:atexit

    基于stack结构实现的,所以用atexit注册的函数在进程exit的时候是reverse order执行的(跟Chapter11提到的进程清理函数也类似)

    这部分的代码比较直观,看书上P202 Figure7.3代码即可。

 APUE 英文3版201页Figure7.2是个比较综合的图,很好阐述了进程开始和结束的各种路径以及做的事情

    简单来说:

    1. return或exit :先调用各种exit handler以及standard I/O cleanup;再调用_exit或_Exit

    2. 如果是直接_exit或_Exit就直接强行退出进程,一步到位,不会调用各种exit handler和Cleanup等了

(三)Command-Line Arguments

  没有什么特别解释的 就是main传入两个参数:

  1. int argc:参数个数

  2. char *argv[]:以字符串形式传入的参数

  argv[0]永远是命令本身,从argv[1]开始是真正传入程序的参数

(四)Environment List

  之前main的参数中是有这个的;但是后来发现这东西的用途太多了,地位就升级了,就给他专门搞了一些内置的函数去操作

(五)Memory Layout of a C program

  重点都在P206的Figure7.6上面。

  地址由高到低依次是:

  第一部分:Command-Line arguments & environment variables

  第二部分:stack(栈)(调用函数的stack frame在这里,函数返回之后,这部分资源就可能瞬间被其他内容覆盖了)

  第三部分:留白 (stack可以向下grow,占用这块留白;heap可以向上grow,占用这块留白)

  第四部分:heap(堆)(提供动态分配的空间:malloc;如果忘了free,就memory leak了)

  第五部分:uninitialized data (没有初始化的全局变量)

  第六部分:initialized data (初始化的全局变量)

  第七部分:text segment(包括CPU可执行的machine instructions)

  其中,只有六、七两部分是存在于program file中的;五貌似也像在program file中的,其实不是的,是由kernel设置为0的。

(六)Shared Libraries、(七)Memory Allocation留以后用到再看

(八)Environment Variables

  由于Environment Variables的地位提高了,因此有三个函数可以改环境变量:

    1. putenv

    2. setenv

    3. unsetenv

  这里有两点需要注意下:

    1. 就是这个简单的Environment Variables,为什么要搞这样几个复杂的函数去设置、修改?回想Memory Layout of a C program,最上面那块大小是定死的:如果EV比原来短还好,比原来长,或者动态增加,就需要利用heap空间了。这就涉及到一些麻烦事情。详情书上写的挺好。

    2. 进程中设定EV的作用域:在当前进程设置的EV,只对当前进程以及其子进程有效,不影响其他进程。

(九)setjmp和longjmp

  代码都在书上,很直观就不粘上来了。

  Goto是在同一个函数中跳转(某个stack frame内);setjmp和longjmp负责在一个进程的函数间跳(夸若干个stack frame)

  有几点需要注意:

    1. setjmp设定跳回到哪,longjmp负责跳,用jmp_buf类型的变量来协调二者,跳到哪。

    2. 通一个setjmp可以从不同地方longjmp回来

    3. f1() { setjmp; f2(){f3(longjmp;)}} 如果从f3中跳回f1,则stack中f2和f3的stack frame都无效了(即不归f2和f3是换了,可能迅速被其他占用了)

    4. 还是3中的例子,如果longjmp回到f1中了,那么f1中变量的状态呢?受到执行完f1和f2之后的影响,还是保存之前的状态呢?答案是不一定,尤其是autmatic register变量,更是不一定了。这里比较好的办法是,把变量设成volatile的,这样即使longjmp回来,变量肯定是受到f2和f3的影响后的值,不会出现不确定状态

(十)getrlimit & setrlimit

  涉及到进程占用资源的分配,后面再看。

  

  

【APUE】Chapter7 Process Environment的更多相关文章

  1. 【APUE】Chapter8 Process Control

    这章的内容比较多.按照小节序号来组织笔记的结构:再结合函数的示例带代码标注出来需要注意的地方. 下面的内容只是个人看书时思考内容的总结,并不能代替看书(毕竟APUE是一本大多数人公认的UNIX圣经). ...

  2. 【APUE】Chapter9 Process Relationships

    这一章看的比较混乱,可能是因为例子少:再有就是,这一章就是一个铺垫的章节. 9.2 terminal logins 啥叫termnial? 我感觉书上的terminal指的更可能是一些物理设备(key ...

  3. 【APUE】Chapter10 Signals

    Signal主要分两大部分: A. 什么是Signal,有哪些Signal,都是干什么使的. B. 列举了非常多不正确(不可靠)的处理Signal的方式,以及怎么样设计来避免这些错误出现. 10.2 ...

  4. 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘

    [C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...

  5. 【APUE】Chapter16 Network IPC: Sockets & makefile写法学习

    16.1 Introduction Chapter15讲的是同一个machine之间不同进程的通信,这一章内容是不同machine之间通过network通信,切入点是socket. 16.2 Sock ...

  6. 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方

    刚上线一个新版本,其中有台电脑打开软件就报[xx的类型初始值设定项引发异常](还好不是一大波电脑,新东西上线就怕哀鸿遍野),如图: 显然是该类型的静态构造函数中抛异常了(红线处就是类名),遂打开该类, ...

  7. 【APUE】Chapter15 Interprocess Communication

    15.1 Introduction 这部分太多概念我不了解.只看懂了最后一段,进程间通信(IPC)内容被组织成了三个部分: (1)classical IPC : pipes, FIFOs, messa ...

  8. 【APUE】Chapter1 UNIX System Overview

    这章内容就是“provides a whirlwind tour of the UNIX System from a programmer's perspective”. 其实在看这章内容的时候,已经 ...

  9. 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐

    17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...

随机推荐

  1. AD的命名规则 AD常用产品型号命名规则

    AD的命名规则 AD常用产品型号命名规则 DSP信号处理器    放大器工业用器件通信    电源管理    移动通信 视频/图像处理器等 模拟A/D    D/A 转换器 传感器    模拟器件 A ...

  2. RF脚本中的坑1: SyntaxError: invalid token

    话不多说,直接上调试脚本: 执行后${b}=8:没问题.然后${a}改成08继续: 执行后居然报错了: 经过多次尝试08或者09时,都会报SyntaxError错误:后来查阅语法,才恍然大悟:Pyth ...

  3. 在WINDOWS下安装PEAR

    一.从官网下载go-pear.phar 文件,地址http://pear.php.net/go-pear.phar 将下载好的文件go-pear.phar 放到PHP安装目录下,dos 命令下进入PH ...

  4. Invalid MyEclipse License - Discontinuing this MyEclipse operation. 出现这个错误怎么改正?

    Invalid MyEclipse License - Discontinuing this MyEclipse operation这句话的意思是无效的许可证-停用此MyEclipse操作入门就是你的 ...

  5. IOS 运行循环

    . 运行循环========================================在iOS的应用程序中,应用程序启动之后,系统即会创建一个运行循环监听用户的交互. 以下代码其本质是在运行循环 ...

  6. 砍树,POJ(2665)

    题目链接:http://poj.org/problem?id=2665 解题报告: 这里的区域没有重复,若有重复的话,模拟即可. #include <cstdio> #include &l ...

  7. ios视图层次结构

    原文:http://blog.csdn.net/xingboss3/article/details/7890238 UIView表示屏幕上的一块矩形区域,它在App中占有绝对重要的地位,因为IOS中几 ...

  8. 【转】Druid连接池一个设置引发的血案

    https://my.oschina.net/haogrgr/blog/224010 今天在一台配置很低的机器上运行批量更新的程序~~~ 大概跑了三十分钟~~~这配置~~~这程序~~~ 然后华丽丽的报 ...

  9. Linux(三) - 文件操作相关命令

    Ctl-A 光标移动到行首 Ctl-C 终止命令 Ctl-D 注销登录 Ctl-E 光标移动到行尾 Ctl-U 删除光标到行首的所有字符,在某些设置下,删除全行 Ctl-W 删除当前光标到前边的最近一 ...

  10. IE问题——列表项图像

    等我们实现列表时,经常会遇到一种情况:需要为列表的每一项的前面添加一个列表项图像. 我们在查阅W3C时会发现,在CSS中已经为我们提供了实现方法——“list-style-type”,我们来看看它的实 ...