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. 在本地设置 http-proxy 代理 (前后端分离)

    1. 利用package.json 安装nodejs,创建package.json文件:内容如下 "dependencies": { "http-proxy": ...

  2. 使用easyui将json数据生成数据表格

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

  3. CS231n 斯坦福深度视觉识别课 学习笔记(完结)

    课程地址 第1章 CS231n课程介绍 ---1.1 计算机视觉概述 这门课的主要内容是计算机视觉.它是一门需要涉及很多其他科目知识的学科. 视觉数据占据了互联网的绝大多数,但是它们很难利用. --- ...

  4. iOS8 对开发者来说意味着什么?

    今天凌晨,Apple WWDC2014 iOS8 正式推出! 也许,对于广大iOS用户来说,iOS8的创新并不是特别多. 但对于开发者来说,影响却将会是无比巨大的! 正如Apple官网上的广告:Hug ...

  5. [LeetCode&Python] Problem 883. Projection Area of 3D Shapes

    On a N * N grid, we place some 1 * 1 * 1 cubes that are axis-aligned with the x, y, and z axes. Each ...

  6. 使用 WPF 开发一个 Windows 屏幕保护程序

    最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面.我想了想,屏幕保护程序可以做到这一点,而且,屏幕保护程序的开发也是非常简单的. 本文将介绍如何为 Windows ...

  7. CTF-练习平台-Misc之 听首音乐

    十九.听首音乐 用软件audacity打开后发现如下 上面那一行是可以看做摩斯电码,翻译过来是: ..... -... -.-. ----. ..--- ..... -.... ....- ----. ...

  8. Spring Data Jpa 使用@Query标注自定义查询语句

    https://blog.csdn.net/daniel7443/article/details/51159865 https://blog.csdn.net/pp_fzp/article/detai ...

  9. [题解] CodeM美团点评编程竞赛资格赛题

    最近看到牛课网美团一个编程竞赛,想着做做看,结果一写就是两天..真是写不动了啊.话不多说,下面开始我的题解. 题目大致还是比较考察思维和代码能力(因为自己代码能力较弱,才会觉得比较考察代码能力吧= = ...

  10. calc()语法

    什么是calc()? 学习calc()之前,我们有必要先知道calc()是什么?只有知道了他是个什么东东?在实际运用中更好的使用他. calc()从字面我们可以把他理解为一个函数function.其实 ...