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. 使用easyui将json数据生成数据表格

    1.首先需要用script引入jquery和easyui文件.如图所示: 2.html页面设置如下: data-options里面设置的属性可根据需要自己定义,是否单选,是否设置分页等等. 3.引入e ...

  2. Redis 缓存服务器

    Redis 服务器 Remote Dictionay Server   Redis是一个key-value持久化产品,通常被称为数据结构服务器. Redis的key是string类型:value可以是 ...

  3. Xcode清理垃圾

    摘抄自https://blog.csdn.net/hu434587115/article/details/54602449 ~/Library/Developer/Xcode/DerivedData/ ...

  4. 【c++基础】int转string自动补零

    前言 使用to_string函数可以将不同类型的数据转换为string类,请参考here和here.如果string的位数固定,如何进行自动补零呢?请看本文实例! 代码 确定位数,to_string ...

  5. git log 退出方法

    前言 使用git的过程中会有一些疑问,理当记录,方便自己随时查看,可能也会帮助他人解惑,甚好! 1.git log退出方法 使用git log之后无法回到主页面,如下图所示,最后只能暴力关闭git b ...

  6. ZOJ 3551 吸血鬼 概率DP

    解题报告链接: http://www.cnblogs.com/183zyz/archive/2012/09/13/2683524.html 做法:设当有i个吸血鬼时变成n个吸血鬼的天数的数学期望为dp ...

  7. grandstack graphql 工具基本试用

      grandstack 是一个方便graphql 应用开发的工具 使用docker-compose 运行 环境准备 官方的starter 比较好,已经是使用docker-compose 创建好了所有 ...

  8. ThinkPHP 的一个神秘版本 ThinkPHP 1.2

    ThinkPHP 的一个神秘版本 ThinkPHP 1.2 询问过 ThinkPHP 官网的小伙伴都知道,偶尔 ThinkPHP 故障时会出现 ThinkPHP 1.2(下次看到就截图下来). 但是我 ...

  9. java 中一些需要注意的知识点

    java数组的length属性是容量,而不是数组真实元素的个数: 多线程中的interrupt()方法并不会终止处于"运行状态"的线程,它只是将线程的中断标记设为true. juc ...

  10. php生成迷宫和迷宫寻址算法实例

    较之前的终于有所改善.生成迷宫的算法和寻址算法其实是一样.只是一个用了遍历一个用了递归.参考了网上的Mike Gold的算法. <?php //zairwolf z@cot8.com heade ...