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. MVCPager学习小记

    1.PageIndexParameterName怎么关联? 答:其实就是Action里面的pageindex参数 例子: @Html.Pager(Model, new PagerOptions { P ...

  2. VueX源码分析(4)

    VueX源码分析(4) /module store.js /module/module.js import { forEachValue } from '../util' // Base data s ...

  3. 学习笔记(四): Representation:Feature Engineering/Qualities of Good Features/Cleaning Data/Feature Sets

    目录 Representation Feature Engineering Mapping Raw Data to Features Mapping numeric values Mapping ca ...

  4. CNCF 有哪些具体的项目内容?

    前言:CNCF(Cloud Native Computing Foundation)于 2015 年 7 月成立,隶属于 Linux 基金会,初衷围绕“云原生”服务云计算,致力于维护和集成开源技术,支 ...

  5. centOS下lnamp安装

    首先安装apache,mysql ,最后安装php 1>apache安装 安装:yum install -y httpd 运行:/bin/systemctl start httpd.servic ...

  6. 面试:如何把xxx.sh使用/etc/init.d/xxx.sh start启动,并且可以用chkconfig配置开机自启动

    chkconfig原理: 1.脚本放到/etc/init.d下面,并且可执行(/etc/init.d/sshd) 需要被chkconfig管理,需要添加进去chkconfig  --add  sshd ...

  7. 【线程池】ExecutorService与quartz搭配出现的问题

    问题描述: 使用quartz定时推送微信公众号模板消息,一分钟推送一次,定时器里面使用了一个ExecutorService线程池,大小为5个. 批量获取数据之后,全部数据都被分配到n/5的线程池里面等 ...

  8. vue 使用lib-flexable,px2rem 进行移动端适配 但是引入的第三方UI组件 vux 的样式缩小,解决方案

    最近在写移动端项目,就想用lib-flexable,px2rem来进行适配,把px转换成rem但是也用到了第三方UI组件库vux,把这个引入发现一个问题就是vux的组件都缩小了,在网上找不到答案,最后 ...

  9. MySQL中 IFNULL、NULLIF和ISNULL函数的用法

    mysql 中 ifnull().nullif().isnull()函数的用法讲解: 一.IFNULL(expr1,expr2)用法: 假如expr1不为NULL,则 IFNULL() 的返回值为ex ...

  10. python计算机基础(三)

    简述Python垃圾回收机制: 当x=10,赋值x=11,的代码,也就是10没有对应的变量名, 10在python眼中相当于垃圾,就会被清理掉,释放内存. 对于下述代码: x = 10 y = 10 ...