chapter6 进程
重点关注进程虚拟内存的布局及内容。
6.1 进程和程序
进程(process)是一个可执行程序(program)的实例。
程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程,所包含的内容如下。
(1):二进制格式标识:每个程序文件都包含用于描述可执行文件格式的元信息。
(2):机器语言指令;对程序算法进行编码
(3):程序入口地址:标识程序开始执行时的起始指令位置。
(4):数据:包含的变量初始值和程序使用的字面量值
(5):符号表以及重定位表:描述程序中函数和变量的位置以及名称。
(6):共享库和动态链接信息:
(7):其他信息

6.2 进程号和父进程号
每个进程都有一个进程号(PID),进程号是一个正数,用以唯一标识系统中的某个进程。
#include <unistd.h>
pid_t getpid(void);
除少数系统进程外,init进程号为1,程序和运行改程序的进程号之间没有固定的关系。
Linux内核限制的进程号小于等于32767.
每个进程都有一个创建自己的父进程。使用系统调动getppid()可以检索出父进程的进程号
#include <unistd.h>
pid_t getppid(void);
1号进程——init进程,即所有进程的始祖。pstree(1)命令可以查看到这一“家族树”。如果子进程的父进程终止,则子进程就会变成“孤儿”,init进程随即将收养该进程,进程后续对getppid()的调用将返回进程号1.

6.3 进程内存布局
每个进程所分配的内存有很多部分组成,通常称之为“段(segment)”.
文本段:包含了进程运行的程序机器语言指令。
初始化数据段:包含显示初始化的全局变量和静态变量。
未初始化数据段:包含未显示初始化的全局变量和静态变量。
栈(stack):是一个动态增长和收缩的端,由栈帧(stack frames)组成。
堆(heap): 是可在运行时(为变量)动态进行内存分配的一块区域。

在大多数UNIX实现中C语言编程环境提供了3个全局符号(symbol):etext,edata和end,可在程序内使用这些符号以获取相应程序文本段,初始化数据段和非初始化数据段结尾处下一字节的地址。使用这些符号,必须显示声明如下:
extern char etext, edata, end;
6.4 虚拟内存管理
(1):空间局部性:是指程序倾向于访问在最近访问过的内存地址附近的内存(由于指令是顺序执行的,且有时会按顺序处理数据结构)
(2):时间局部性:是指程序倾向于在不久的将来再次访问最近刚访问过得内存地址(由于循环).

6.5栈和栈帧率
函数的调用和返回使栈的增长和收缩呈线性。

6.6 命令行参数
每个C语言程序都必须有一个称为main()的函数,作为程序启动的起点。

6.7 环境列表
每个进程都有与其相关的称之为环境列表的字符串数组,或简称为环境。
从程序中访问环境:
在C语言程序中,可以使用全局变量char **environ访问环境列表。
e.g.:
extern char **environ;
int main(int argc, char *argv[])
{
char **ep;
for(ep = environ; *ep != NULL; ep++)
{
puts(*ep);
}
}
此外,还可以通过申明main()函数中的第三个参数来访问环境列表:
int main(int argc, char *argv[], char *envp[])
getenv()函数能够从进程环境中检索单个值。
#include <stdlib.h>
char *getenv(const char* name);

修改环境:
putenv()函数向调用进程的环境中添加一个新变量,或者修改一个已经存在的变量值。
#include <stdlib.h>
int putenv(char *string);
调用失败将返回非0值,而非-1.

setenv()函数可以代替putenv()函数,向环境中添加一个变量。
#include <stdlib.h>
int setenv(const char *name, const char *value, int overwrite);

unsetenv()函数从环境中移除由name参数标志的变量。
#include <stdlib.h>
int unsetenv(const char *name);

clearenv():
#define _BSD_SOURCE
#include <stdlib.h>
int clearenv(void);

6.8 执行非局部跳转:setjmp()和longjmp()
使用库函数setjmp()和longjmp()可执行非局部跳转。
#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
setjmp()调用为后续由longjmp()调用执行的跳转确立了跳转目标。该目标正是程序发起setjmp()调用的位置。

【Linux_Unix系统编程】chapter6 进程的更多相关文章

  1. Linux系统编程——Daemon进程

    目录 Daemon进程介绍 前提知识 Daemon进程的编程规则 Daemon进程介绍 Daemon运行在后台也称作"后台服务进程". 它是没有控制终端与之相连的进程.它独立与控制 ...

  2. linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid

    本节目标: 僵进程 SIGCHLD wait waitpid 一,僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. ...

  3. linux系统编程之进程(五)

    今天继续学习系统编程,学习的主题还是进程,今天主要讨论的是守护进程相关的概念,开始进入正题: 什么是守护进程:       守护进程的创建步骤: 在描述它之前,首先得先了解两个概念:进程组.会话期: ...

  4. linux系统编程之进程(一)

    今天起,开始学习linux系统编程中的另一个新的知识点----进程,在学习进程之前,有很多关于进程的概念需要了解,但是,概念是很枯燥的,也是让人很容易迷糊的,所以,先抛开这些抽象的概念,以实际编码来熟 ...

  5. linux系统编程之进程(二):进程生命周期与PCB(进程控制块)

    本节目标: 进程状态变迁 进程控制块 进程创建 进程撤消 终止进程的五种方法 一,进程状态变迁 进程的三种基本状态 就绪(Ready)状态 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便 ...

  6. linux系统编程--守护进程,会话,进程组,终端

    终端: 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal), 进程中,控制终端是保存在PCB中的信息,而f ...

  7. Linux系统编程之进程概念

    注:本文部分图片来源于网络,如有侵权,请告知删除 1. 什么是进程? 在了解进程概念之前,我们需要先知道程序的概念. 程序,是指编译好的二进制文件,这些文件在磁盘上,并不占用系统资源. 进程,指的是一 ...

  8. 【Linux_Unix系统编程】Chapter9 进程凭证

    chapter9 进程凭证 每个进程都有一套用数字表示的用户ID(UID)和组ID(GID).有时也将这些ID称子为进程凭证. 1:实际用户ID和实际组ID 2:有效用户ID和有效组ID 3:保存的s ...

  9. 【Linux_Unix系统编程】Chapter4 文件IO

    Chapter4 文件IO 4.1 概述 文件描述符 == Windows的句柄 标准文件描述符: 0 标准输入 STDIN_FILENO stdin 1 标准输出 STDOUT_FILENO std ...

随机推荐

  1. SWIFT中用Switch case 类类型

    有时觉得SWIFT的语法真的强大而又变态,不说了,直接上代码瞅瞅: 首先先定义一个交通工具的父类 class Vehicle{ var wheels:Int! var speed:Double! in ...

  2. 特征选择 - Filter、Wrapper、Embedded

    Filter methods: information gain chi-square test fisher score correlation coefficient variance thres ...

  3. ppt正文排版

  4. webstorm快捷键汇总

    查找替换 Webstorm快捷键 Eclipse快捷键 说明 ctrl+shift+N ctrl+shift+R 通过文件名快速查找工程内的文件(必记) ctrl+shift+alt+N ctrl+s ...

  5. ES6必知必会 (四)—— Symbol、Set和Map

    Symbol 1.Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种分别是:undefined.null.布尔值(Bool ...

  6. IntelliJ IDEA 2017激活

    最新更新: 在激活Jetbrains旗下任意产品的时候选择激活服务器 填入以下地址便可成功激活 http://idea.liyang.io 点击help→Register→License sever ...

  7. Oracle 11gR2 RAC 常用维护操作 说明

    一.启动和停止集群 在Oracle 11gR2 下的RAC,架构发生了变化.CRS的信息也是放在ASM 实例里的,所以要关asm,必须关闭crs, 如果还使用了acfs的话,一关crs那么acfs里的 ...

  8. let、var、const区别(表格比较)

    let.var.const区别(表格比较): 区别项 let var const 作用域 块级作用域 全局作用域或函数作用域 块级作用域 是否有变量提升 无 有 无 是否可重复声明 不可 可以 不可 ...

  9. chrome浏览器network面板出现:Provisional headers are shown 提示

    一般来说,如果看到这个提示,说明这个请求并没有发送出去. 具体原因有多种: 请求被某些扩展如 Adblock 拦截了 请求被墙了 走本地缓存或者 dataurl 的请求 client发送请求后,由于各 ...

  10. ZedGraph控件的使用

    http://blog.chinaunix.net/uid-20776117-id-1847015.html 在我们编写程序的时候,有时候是要做一些统计的,为了达到一目了然的效果,饼状图,曲线图,柱状 ...