1.main函数

C程序总是从main函数开始执行,当内核执行C程序时,在调用main函数之前先调用exec函数从内核获取命令行参数和环境变量值
 

2.进程终止

正常终止:
(1)在main函数内执行return语句
(2)调用exit
(3)最后一个线程从其启动例程返回
(4)最后一个线程调用pthread_exit
 
异常中止:
(1)调用abort
(2)接收到一个信号并终止(内存越界或除0)
(3)最后一个线程对取消请求作出响应
 
内核使程序执行的唯一方法就是调用exec函数,进程自愿终止的唯一方法就是调用exit
 

3.C程序的存储空间布局

 
a.out中还有其他类型的段,比如 符号表段、调试信息段、动态共享库段
 
size命令查看 正文段、数据段和bss(未初始化数据段)的长度。 如  size  /usr/bin/cc
 

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 学习笔记(五) 进程环境的更多相关文章

  1. Linux System Programming 学习笔记(五) 进程管理

    1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity in ...

  2. APUE 学习笔记(六) 进程控制

    1. fork 创建新进程 fork创建的新进程称为子进程,fork函数调用一次,返回两次. 两次返回的唯一区别就是子进程的返回值是0,而父进程的返回值是新子进程的进程ID 在fork之后是父进程先执 ...

  3. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  4. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  5. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  6. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  7. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  8. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  9. Linux学习笔记(五) 账号管理

    1.用户与组账号 用户账号:包括实际人员和逻辑性对象(例如应用程序执行特定工作的账号) 每一个用户账号包含一个唯一的用户 ID 和组 ID 标准用户是系统安装过程中自动创建的用户账号,其中除 root ...

随机推荐

  1. cocos2dx for lua 简单的翻牌动画

    local x = 20 local y = display.height/2 for i = 1,16 do--创建16张 local cardFg = display.newSprite(&quo ...

  2. 【数位dp】bzoj3131: [Sdoi2013]淘金

    思路比较自然,但我要是考场上写估计会写挂:好像被什么不得了的细节苟住了?…… Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1. ...

  3. 素材网站——mokuge

  4. 解决mysql出现的问题#1055 - Expression of SELECT list is not in GROUP BY clause and contains nonaggregated column this i

    最近在学flask, 在访问主页时,一直出现1055错误,在网上找的解决方法是删除ONLY_FULL_GROUP_BY,当时是删除了,但是退出在进行select @@sql_mode时,仍出现ONLY ...

  5. Python3 简单封装 sqlite3 - SimpleToolSql

    #coding: utf-8 #Author:boxker #Mail:icjb@foxmail.com import sqlite3 import os class simpleToolSql(): ...

  6. 【nginx】nginx.sh nginx 安装脚本

    #! /bin/shcd /usr/local/srcwget http://nginx.org/download/nginx-1.10.1.tar.gzecho 'download success' ...

  7. python可视化动态图表: 关于pyecharts的sankey桑基图绘制

    最近因工作原因,需要处理一些数据,顺便学习一下动态图表的绘制.本质是使具有源头的流动信息能够准确找到其上下级关系和流向. 数据来源是csv文件 导入成为dataframe之后,列为其车辆的各部件供应商 ...

  8. Python9-事件及队列-day37

    信号量 from multiprocessing import Process from multiprocessing import Semaphore import time import ran ...

  9. Report Server multiple value 多值选择

    一.项目需求 今天在做项目的时候,有一个需求,具体如下:在Report Server中存在一个报表,报表中有一个参数doctor_name,该参数允许多值,默认全部.但是由于前端页面医生选择时多选没有 ...

  10. 和为n连续正数序列 【微软面试100题 第五十一题】

    题目要求: 输入一个正数n,输出所有和为n连续正数序列(至少两个). 例如输入15,由于1+2+3+4+5 = 4+5+6 = 7+8 = 15.所以输出3个连续序列1~5,4~6,7~8. 参考资料 ...