读书笔记-APUE第三版-(7)进程环境

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

进程启动终止

如图所示:

  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)进程环境,布布扣,bubuko.com

时间: 2024-12-22 05:47:17

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

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

进程ID 每一个进程都有一个唯一的进程ID.几个特殊进程: 0号进程是内核进程,一般是调度进程swapper. 1号进程init,是用户进程(以root权限执行/sbin/init),负责初始化. 几个重要函数:getpid(进程ID)/getppid(父进程ID)/getuid(进程真有用户ID)/geteuid(进程有效用户ID)/getgid(进程真有用户组ID)/getegid(进程有效用户组ID). fork/exec/wait例程 fork家族函数用于创建子进程(父子进程关系下节详细

读书笔记-APUE第三版-(9)进程关系

登录过程 终端登录 init从/etc/ttys中读取终端信息,对每个允许登录的终端,都fork子进程,并执行getty.getty打开终端设备,执行login: execle("/bin/login,"login", "-p", username, (char *)0, envp) login进行用户名密码验证,同时还会进行切换到用户主目录/修改终端设备属主&读写权限/创建进程组/setuid等动作,然后运行login shell. execl(

读书笔记-APUE第三版-(5)标准IO库

ISO C标准I/O库使用流的概念读写文件.流是对数据传输的抽象,可以把流理解为从起点到终点间的字节序列. 标准I/O库通过维护进程空间内的缓冲区,减少read/write系统调用次数来提高I/O效率.之前介绍的Unbuffered I/O和文件描述符fd打交道,标准I/O则使用FILE指针. typedef struct{ short level;/*缓冲区满程度*/ unsigned flags;/*文件打开状态标志*/ char fd;/*文件描述符*/ unsigned char hol

读书笔记-APUE第三版-(6)系统数据文件和信息

常见系统数据文件 下表列出了常见的系统数据文件及其查找函数. 以/etc/passwd文件为例,读取数据的程序基本框架如下: void get_pw_entry() { struct passwd *ptr; setpwent(); while ((ptr = getpwent()) != 0) { -- } endpwent(); return ptr; } 每个数据文件都提供了一个get方法返回文件下一个记录项. set方法充值当前位置到文件开始处. end方法关闭数据文件. 表格中的get

【字源大挪移—读书笔记】 第三部分:字尾

[字源大挪移—读书笔记] 第三部分:字尾 [3 字尾:[3.1]名词字尾.[3.2]形容词字尾.[3.3]副词字尾.[3.4]动词字尾 [3.1]名词字尾(Noun) [3.1.1]表示[人]的字尾 -ain -aire -an -ian -ean -ese -ant -ent -ary -ate -ee {[备注]:和-er相反,表示"被……的人":} -eer -er -or -ar -ier -eur -ician -ist -ite -ive -man -on -ster -y

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

<Programming Hive>读书笔记(一)Hadoop和Hive环境搭建 先把基本的技术和工具学好,才能更高效地思考和工作. Chapter 1.Introduction 简介 Chapter 2.Getting Started 环境配置 Hadoop版本会更新,以官方安装教程为准 http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/SingleCluster.html#Standalone_O

《众妙之门 JavaScript与jQuery技术精粹》 - 读书笔记总结[无章节版][1-60]

近期,反复思考后,还是把所有的笔记通过随笔的方式整理出来放在论坛里,可以让自己对学过的知识有个比较系统而清晰的呈现: 同时,为以后用到相关的知识点做一个整理和查阅. (一)JSON-P 的实例代码展示 1 <div id="delicious"></div> 2 <script type="text/javascript"> 3 // 可以在JavaScript中直接使用JSON,并且封装在函数调用中时,可作为API的返回值. 4

读书笔记-单元测试艺术(三)-使用桩对象解除依赖

一.几个概念 1.什么是外部依赖 外部依赖是指在系统中代码与其交互的对象,而且无法对其做人为控制. 最常见的例子是文件系统.线程.内存和时间等,我们使用桩对象来处理外部依赖问题. 2.什么是桩对象 桩对象是对系统中现有依赖的一个替代品,可人为控制. 通过使用桩对象,无需涉及依赖项,即可直接对代码进行测试. 3.什么是重构 重构是指不影响已有功能而改变代码设计的一种行为 4.什么是接缝 接缝是指代码中可以插入不同功能(如桩对象类)的地方. 二.解除依赖 抽象一个接口 namespace LogAn

4441数据结构读书笔记系列(三)

3.2 线性表的定义 线性表(List):零个或多个数据元素的有限序列. 元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继. 线性表强调是有限的. 在较复杂的线性表中,一个数据元素可以由若干个数据项组成. 3.4 线性表的顺序存储结构 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 描述顺序存储结构需要三个属性: 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置. 线性表的最大存储