APUE 学习笔记(五) 进程环境
1.main函数
2.进程终止
3.C程序的存储空间布局

4. setjmp longjmp
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <setjmp.h>
- static jmp_buf jmpbuf;
- static int globval = ;
- static void func2(void)
- {
- longjmp(jmpbuf, );
- }
- static void func1(int i, int j, int k, int l)
- {
- fprintf(stdout, "in func1:\n");
- fprintf(stdout, "globval = %d,"
- "autoval = %d,"
- "regival = %d,"
- "volaval = %d,"
- "statval = %d\n", globval, i, j, k , l);
- func2();
- }
- int main(int argc, char* argv[])
- {
- int autoval = ;
- register int regival = ;
- volatile int volaval = ;
- static int statval = ;
- if (setjmp(jmpbuf) != ) {
- fprintf(stdout, "after longjmp:\n");
- fprintf(stdout, "globval = %d,"
- "autoval = %d,"
- "regival = %d,"
- "volaval = %d,"
- "statval = %d\n",
- globval, autoval, regival, volaval, statval);
- exit();
- }
- globval = ;
- autoval = ;
- regival = ;
- volaval = ;
- statval = ;
- func1(autoval, regival, volaval, statval);
- exit();
- }
编译时不进行优化,结果如下:
- in func1:
- globval = ,autoval = ,regival = ,volaval = ,statval =
- after longjmp:
- globval = ,autoval = ,regival = ,volaval = ,statval =
编译时进行全部优化,结果如下:
- in func1:
- globval = ,autoval = ,regival = ,volaval = ,statval =
- after longjmp:
- globval = ,autoval = ,regival = ,volaval = ,statval =
我们可以看到:全局、静态、易失变量不受优化的影响,在调用longjmp之后,他们的值是最近所呈现的值
未优化时,所有5个变量都存放在存储器中,而进行优化之后,autoval 和 regival 都存放在寄存器中,而 volatile变量仍存放在 存储器中
对于 volatile 修饰符用法,这里有一篇很好的文章:http://hedengcheng.com/?p=725
APUE 学习笔记(五) 进程环境的更多相关文章
- Linux System Programming 学习笔记(五) 进程管理
1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity in ...
- APUE 学习笔记(六) 进程控制
1. fork 创建新进程 fork创建的新进程称为子进程,fork函数调用一次,返回两次. 两次返回的唯一区别就是子进程的返回值是0,而父进程的返回值是新子进程的进程ID 在fork之后是父进程先执 ...
- APUE学习笔记3_文件IO
APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause
转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...
- 【opencv学习笔记五】一个简单程序:图像读取与显示
今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...
- Linux学习笔记(五) 账号管理
1.用户与组账号 用户账号:包括实际人员和逻辑性对象(例如应用程序执行特定工作的账号) 每一个用户账号包含一个唯一的用户 ID 和组 ID 标准用户是系统安装过程中自动创建的用户账号,其中除 root ...
随机推荐
- 《队长说得队》【Alpha】Scrum meeting 3
项目 内容 这个作业属于哪个课程 >>2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 >>实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 ...
- ctDNA|endosymbiosis
5.10叶绿体基因组编码多种蛋白质和RNA 叶绿体和线粒体的共同点:叶绿体和线粒体的大小,功能(编码区)大体一致,但叶绿体拥有更多基因,所以在编码tRNA时,也有内含子作为被剪切片段. 因为在原核生物 ...
- runtime实践之Method Swizzling
利用 Objective-C 的 Runtime 特性,我们可以给语言做扩展,帮助解决项目开发中的一些设计和技术问题.这一篇,我们来探索一些利用 Objective-C Runtime 的黑色技巧.这 ...
- 解决Windows 与Mac 双系统下的蓝牙设备共用的问题
不知道有多少人和我一样用的蓝牙鼠标或者键盘,有的话应该都会遇到同一个问题:即在一个系统下配好对后在另一个系统必须重新配对才能使用,很是麻烦.还要将蓝牙设备进入发现模式,OS下搜索,连接....终于昨天 ...
- [bzoj]3436 小K的农场
[题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的 ...
- Unity基础-Input接口
input 底层的设备输入接口,在开发中很少用到 Input.GetKey() // Update is called once per frame void Update () { if (Inpu ...
- Java-basic-6-方法
命令行参数的使用 public class test { public static void main(String args[]) { for(int i = 0; i < args.len ...
- poj-1979 red and black(搜索)
Time limit1000 ms Memory limit30000 kB There is a rectangular room, covered with square tiles. Each ...
- 下拉列表 Spinner
在Web开发中,HTML提供了下拉列表的实现,就是使用<select>元素实现一个下拉列表,在其中每个下拉列表项使用<option>表示即可.这是在Web开发中一个必不可少的交 ...
- 光学字符识别OCR-5 文本切割
经过前面文字定位得到单行的文本区域之后,我们就可以想办法将单行的文本切割为单个的字符了.因为第三步的模型是针对单个的字符建立的,因此这一步也是必须的. 均匀切割 基于方块汉字的假设,事实上最简单的切割 ...