本章关注单进程执行环境:启动&终止、參数传递和内存布局等。

进程启动终止


如图所看到的:

  1. 启动:内核通过exec函数执行程序,在main函数执行之前。会调用启动例程(start-up routine),取得命令行參数和环境变量。能够把启动例程理解为exit(main(argc,argv))。

  2. 终止:五种正常终止方式(从main方法返回/exit/_exit/最后一个线程返回/最后一个线程退出)。三种异常终止方式(abort/接收到信号/最后一个线程接收到取消请求)。

  3. exit与_exit关系:exit调用_exit方法通知内核退出程序,之前会进行清理工作,包含调用用户通过atexit函数注冊的回调方法和标准I/O的fclose函数。

命令行參数和环境变量

main函数原型为:

int main(int argc, char *argv[]);

当中argc为參数个数,argv为參数指针数组,能够通过下面方法訪问:

for (i = 0; i <argc; i++) /* echo all command-line args */
printf("argv[%d]: %s\n", i, argv[i]);

环境变量也被传递给程序,环境变量定义在全局指针数组中:

extern char **environ;

能够通过getenv/putenv/setenv/unsetenv等函数訪问环境变量

C程序内存布局


如图所看到的:
  1. text:程序正文段,一般是仅仅读机器指令。
  2. initialized data:显示初始化的全局变量
  3. bss:名称为历史原因(block startedby symbol)。C语言未初始化。由内核初始化为0或者null的全局变量。
  4. heap:堆,动态分配内存。一般向高地址增长。
  5. stack:栈。保存局部变量。函数參数、返回地址等,一般向低地址增长。

  6. 使用size命令能够输出text,data,bss段大小。

  7. 大部分系统都支持共享库,共享库在内存中仅仅须要存在一份,全部进程都能够引用它,其长处是能够减小可运行文件大小,而且共享库能独立升级,使用它的程序不用又一次link。

其它重要函数

  1. 内存分配:malloc/calloc(分配n个大小同样的连续空间)/realloc(又一次分配。用于增大或者减小已经分配的内存空间,可能须要移动指针地址)/free(释放空间,指针的值并不会变成NULL,仅仅是这段内存能够又一次通过malloc分配)。内存分配通过系统调用sbrk来实现。
  2. 栈定位跳转:在C程序中使用goto仅仅能在同一个函数内部跳转。

    setjmp/longjump用于在栈上定位和跳转,一般用于在多层嵌套函数中进行错误处理。

    注意事项:当使用longjmp跳转后,所到达栈的局部变量和寄存器变量的值是不确定的,它们可能回滚到setjmp之前的状态。由于编译器优化后,局部变量和寄存器变量可能位于CPU寄存器上。而位于内存上的静态变量和volatile变量则没有这个问题,它们都保持近期一次被改动的值。

  3. 系统资源限制:getrlimit/setrlimit用于获取设置进程的软硬资源限制。相应系统命令为ulimit

读书笔记-APUE第三版-(7)进程环境的更多相关文章

  1. 读书笔记-APUE第三版-(8)进程控制

    进程ID 每一个进程都有一个唯一的进程ID.几个特殊进程: 0号进程是内核进程,一般是调度进程swapper. 1号进程init,是用户进程(以root权限执行/sbin/init),负责初始化. 几 ...

  2. 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API

    https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...

  3. 《Programming Hive》读书笔记(一)Hadoop和hive环境搭建

    <Programming Hive>读书笔记(一)Hadoop和Hive环境搭建             先把主要的技术和工具学好,才干更高效地思考和工作.   Chapter 1.Int ...

  4. 《APUE》第7章 进程环境-读书笔记

    一.main函数. main函数的原型如下.argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组. int main(int argc, char *argv[]) 当内核执行C程序时 ...

  5. 读书笔记---PMBOK第五版官方中文版

    以下是为了准备PMP考试时学习<PMBOK第五版官方中文版>这本书的笔记和摘要,目的是为了以后可以快速的抓住本书的核心重点复习. 引论 PMPOK的目的 收录了项目管理知识体系中被普遍认可 ...

  6. 《深入理解bootstrap》读书笔记:第三章 CSS布局

    一. 概述一下理念 bootstrap基于H5开发.提倡移动先行(媒询声明是必须的),对浏览器支持面不是很广. 响应式图片:max-width:100% height:auto; 可以加上:.img- ...

  7. Kafka技术内幕 读书笔记之(三) 生产者——消费者:高级API和低级API——基础知识

    1. 使用消费组实现消息队列的两种模式 分布式的消息系统Kafka支持多个生产者和多个消费者,生产者可以将消息发布到集群中不同节点的不同分区上:消费者也可以消费集群中多个节点的多个分区上的消息 . 写 ...

  8. Kafka权威指南 读书笔记之(三)Kafka 生产者一一向 Kafka 写入数据

    不管是把 Kafka 作为消息队列.消息总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个从 Kafka 读取数据的消费者,或者一个兼具两种角色的应用程序. 开发者 ...

  9. Linux内核分析 读书笔记 (第三章)

    第三章 进程管理 3.1 进程 1.进程: 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 进程是处于执行期的程序以及相关的资源的总称. 进程包括代码段和其他资源. 2.线程:执行 ...

随机推荐

  1. Squid 正向代理

    实现通过特定设备对特定的网址访问加速 使用squid 正向代理 实现,区别于反向代理,两者区别的根本在于作为中转的服务器在一个完整的请求中是代表客户端还是代表服务器. 服务端设置 1.安装程序包(推荐 ...

  2. (转)淘淘商城系列——使用solrj来测试索引库

    http://blog.csdn.net/yerenyuan_pku/article/details/72892280 我们使用solrj来操作索引库,一般习惯先建一个单元测试类测试下增删改查方法是否 ...

  3. HDU_1233_还是畅通工程

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. MFC_2.4 组合框和图片控件

    组合框和图片控件 1.拖控件 图片属性更改Type 为Bitmap 名字也要改,不能为IDC_STATIC 绑定变量控件,重命名. 2.初始化 // 设置一个定时器,用于更新图片 SetTimer(0 ...

  5. Jmeter之重定向请求

    一.自动重定向和跟随重定向的区别 自动重定向:状态码一般是200.20X.当重定向自动跳转时,只针对GET和Head请求,自动重定向自动跳转到最终目标页面,当HTTP请求为自动重定向时,JMeter不 ...

  6. CAD绘制单行文字(网页版)

    在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX ...

  7. 梦想CAD控件网页版关于自定义命令

    在CAD控件操作中,为方便使用者,使用自定义命令发出命令,完成CAD绘图,修改,保存等操作.点击此处在线演示. _DMxDrawX::RegistUserCustomCommand 向CAD控件注册一 ...

  8. ThinkPHP---案例--实现知识管理功能

    [一]准备工作 (1)数据表sp_knowledge SQL语句:知识管理数据表结构 create table sp_knowledge( id int(11) not null auto_incre ...

  9. 打造个人的vimIDE

    环境说明 系统版本:centos7.Ubuntu16 vim版本:7.4 安装git工具 整体说明:本文的vim配置是针对Linux的单个系统用户,python的自动补全使用的是 jedi-vim 插 ...

  10. POJ3107 Godfather (树形DP)

    题意:求树的重心 题解:先跑一遍dfs 预处理出这种遍历方式每个节点的儿子(含自己)的数 再跑一遍 每个点的值就是他所有儿子中取一个最大值 再和它父亲这个方向比较一下 又被卡常了 vector一直tl ...