【Linux_Unix系统编程】chapter6 进程
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 进程的更多相关文章
- Linux系统编程——Daemon进程
目录 Daemon进程介绍 前提知识 Daemon进程的编程规则 Daemon进程介绍 Daemon运行在后台也称作"后台服务进程". 它是没有控制终端与之相连的进程.它独立与控制 ...
- linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid
本节目标: 僵进程 SIGCHLD wait waitpid 一,僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. ...
- linux系统编程之进程(五)
今天继续学习系统编程,学习的主题还是进程,今天主要讨论的是守护进程相关的概念,开始进入正题: 什么是守护进程: 守护进程的创建步骤: 在描述它之前,首先得先了解两个概念:进程组.会话期: ...
- linux系统编程之进程(一)
今天起,开始学习linux系统编程中的另一个新的知识点----进程,在学习进程之前,有很多关于进程的概念需要了解,但是,概念是很枯燥的,也是让人很容易迷糊的,所以,先抛开这些抽象的概念,以实际编码来熟 ...
- linux系统编程之进程(二):进程生命周期与PCB(进程控制块)
本节目标: 进程状态变迁 进程控制块 进程创建 进程撤消 终止进程的五种方法 一,进程状态变迁 进程的三种基本状态 就绪(Ready)状态 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便 ...
- linux系统编程--守护进程,会话,进程组,终端
终端: 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal), 进程中,控制终端是保存在PCB中的信息,而f ...
- Linux系统编程之进程概念
注:本文部分图片来源于网络,如有侵权,请告知删除 1. 什么是进程? 在了解进程概念之前,我们需要先知道程序的概念. 程序,是指编译好的二进制文件,这些文件在磁盘上,并不占用系统资源. 进程,指的是一 ...
- 【Linux_Unix系统编程】Chapter9 进程凭证
chapter9 进程凭证 每个进程都有一套用数字表示的用户ID(UID)和组ID(GID).有时也将这些ID称子为进程凭证. 1:实际用户ID和实际组ID 2:有效用户ID和有效组ID 3:保存的s ...
- 【Linux_Unix系统编程】Chapter4 文件IO
Chapter4 文件IO 4.1 概述 文件描述符 == Windows的句柄 标准文件描述符: 0 标准输入 STDIN_FILENO stdin 1 标准输出 STDOUT_FILENO std ...
随机推荐
- ue使用
快捷键CTRL+V:输入代码提示自动补全 编辑器Ultraedit快捷键 说到编辑器的快捷键,VIM是无与伦比的.要反对,也得是带脚踏板的EmaCS.UE还是有差距的,很大差距.注意:VIM是开 ...
- OC基础:类和对象 分类: ios学习 OC 2015-06-12 18:55 17人阅读 评论(0) 收藏
OC:Objective-c 面向对象的c语言,简称obj-c或者OC OC和C的区别 1.OC是C语言的超集,OC是在C语言的基础上结合smalltalk的优点,开发出来的语言.oc兼容所有 ...
- spring jdbc配置文件进行加密解密
最近做一个项目,安全上有点要求,就是要对数据库相关的配置进行加密,配置文件如下: #加密前#datasource.type=mysql #datasource.driverClassName=com. ...
- matlab与vs混合编程/matlab移植
前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...
- 古典、SOA、传统、K8S、ServiceMesh
古典.SOA.传统.K8S.ServiceMesh 十几年前就有一些公司开始践行服务拆分以及SOA,六年前有了微服务的概念,于是大家开始思考SOA和微服务的关系和区别.最近三年Spring Cloud ...
- test20180922 世界第一的猛汉王
题意 分析 由于异色点必有连边,所以一个点的covered减去两个点共有的covered就是可存在的环数,十分巧妙. 代码 #include <bits/stdc++.h> using L ...
- 使用cglib动态创建javabean
动态创建javabean对于我们进行开发,会有一定的帮助,一下是使用cglib动态创建javabean的一个例子: 先贴上code: package com.dalong.CreateCode; im ...
- WebApi_使用技巧
1.自动生成帮助文档 http://www.shaoqun.com/a/234059.aspx 2.Json序列化循环引用的问题http://www.mamicode.com/info-detail ...
- C语言面试题4
第二部分:程序代码评价或者找错 1.下面的代码输出是什么,为什么?void foo(void){ unsigned int a = 6; int b = -20; (a+b > ...
- tomcat源码阅读之日志记录器(Logger)
UML图: 1.Logger接口中定义了日志的级别:FATAL.ERROR.WARNING.INFORMATION.DEBUG,通过接口函数getVerbosity获取日志级别,setVerbosit ...