进程创建

进程通过fork()创建的大致过程:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h> extern int create_process(char* program, char** arg_list); int create_process(char* program, char** arg_list){
pid_t child_pid;
child_pid = fork();
if(child_pid !=0 ){
return child_pid;
}else{
execvp(program, arg_list);
abort();
}
}

概览图:

编译知识

静态库

这里额外补充一些编译相关的内容。一个源码文件要变成可执行的程序,需要经过编译、链接。

这里编译出的.o文件,就是ELF的第一种类型,可重定位文件,格式如下:

  • .text:存放编译好的二进制可执行代码

  • .data:已经初始化好的全局变量

  • .rodata:只读数据,例如字符创常量、const常量

  • .bss:未初始化全局变量,运行时会置0

  • .symtab:符号表,记录的是函数和变量

  • .strtab:字符串表、字符串常量和变量名

在程序中我们提到过函数栈,局部变量是放在里的,在运行期随时分配、随时释放。这里讨论的是文件,还没到执行阶段。

如要将函数作为库文件被重用,不能以.o的形式存在,而是要形成库文件,最简单的类型是静态链接库.a文件。

ar cr libstaticprocess.a process.o
# 形成二进制执行文件staticcreateprocess
gcc -o staticcreateprocess createprocess.o -L. -lstaticprocess

上述第二条命令链接时,createprocess.o调用了create_process函数,但不知道位置,通过将process.o合并进来,就可以确定位置了。这里形成了ELF的第二种格式:

.o相似,文件被分为多个section,通过节头表来描述。这里除了段描述之外,最重要的是p_vaddr——加载到内存的虚拟地址。

静态库特点:

  • 一旦链接,代码和变量的section都合并在一起。当程序运行后,就不依赖这个库是否存在

  • 但如果相同的代码段被多个程序使用时,在内存里就存在多份

  • 当静态库更新了,需重新编译二进制执行文件以应用更新

动态库

当动态链接库被链接到一个程序文件时,最后的程序文件并不包括动态链接库中的代码,而仅仅包括对动态链接库的引用,并且不保存动态链接库的全路径,仅保存其名称

gcc -shared -fPIC -o libdynamicprocess.so process.o

gcc -o dynamiccreateprocess createprocess.o -L. -ldynamicprocess

执行此程序时,先寻找动态链接库,再进行加载。默认,系统在/lib/usr/lib 路径下寻找,找不到则报错。可以通过设定LD_LIBRARY_PATH环境变量,指定动态链接库的路劲。

动态链接库,就是ELF的第三种类型,共享对象文件

  • 多个.interp的Segment,里面是ld-linux.so动态连接器,执行链接动作

  • 多个.plt.got.plt,分别是 过程链接表(PLT)全局偏移量表(GOT)

接下来,我们来看下程序运行时,是如何将so文件动态链接到进程空间的?

  • dynamiccreateprocess程序调用libdynamicprocess.so里的create_process函数时,是运行时才去找的,编译压根不知道在哪,因此在PLT里建立一个PLT[x]——在二进制程序里,不直接调用函数,而是调用PLT[x]里的代理代码,它会在运行时找到真正的create_process函数

  • 去哪找?去GOT里——它会为create_process函数创建GOT[y],对应运行时 create_process函数在内存中真正的地址

  • GOT又是咋知道的?对于create_process函数,GOT在开始时会创建GOT[y],但开始这里没有真正的地址,因为不知道...,它又回调PLT,告诉他:你里面的代理代码来找我要create_process的真实地址,我不知道,你自己想想。

  • PLT只能去调用PLT[0],PLT[0]去调用GOT[2],这里面保存ld-linux.so入口函数,它去找到加载到内存中的libdynamicprocess.so里的create_process函数地址,然后把这个地址放到GOT[y]中,以供下次PLT[x]调用。

运行程序为进程

ELF二进制文件是如何加载到内存里的?

static struct linux_binfmt elf_format = {
.module = THIS_MODULE,
.load_binary = load_elf_binary,
.load_shlib = load_elf_library,
.core_dump = elf_core_dump,
.min_coredump = ELF_EXEC_PAGESIZE,
};

具体调用链:do_execve->do_execveat_common->exec_binprm->search_binary_handler。

在系统调用时,exec最终调用的是load_elf_binary.

进程树

所有进程的祖宗进程,就是系统启动时的init进程。init进程会启动很多daemon进程,为系统运行提供服务。然后启动getty,让用户登录,登录后运行shell。

  • 1号进程是/sbin/init,所有用户态进程的祖先

  • 2号进程是内核线程kthreadd,所有内核态的祖先

  • ps -ef下,用户态不带中括号,内核态带中括号

Linux — 进程管理的更多相关文章

  1. Linux进程管理子系统分析【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51298732 Linux进程管理: 进程与程序: 程序:存放在磁盘上的一系列代码 ...

  2. 12个Linux进程管理命令介绍(转)

    12个Linux进程管理命令介绍 [日期:2015-06-02] 来源:Linux中国  作者:Linux [字体:大 中 小]   执行中的程序在称作进程.当程序以可执行文件存放在存储中,并且运行的 ...

  3. Linux进程管理知识整理

    Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...

  4. Linux性能及调优指南(翻译)之Linux进程管理

    本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...

  5. Linux进程管理专题

    Linux进程管理 (1)进程的诞生介绍了如何表示进程?进程的生命周期.进程的创建等等? Linux支持多种调度器(deadline/realtime/cfs/idle),其中CFS调度器最常见.Li ...

  6. [转帖]十二 个经典 Linux 进程管理命令介绍

    https://www.cnblogs.com/swordxia/p/4550825.html 接了 http referer 头 没法显示图片 可以去原始blog 里面去查看.   随笔- 109  ...

  7. Linux进程管理 (1)进程的诞生

    专题:Linux进程管理专题 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 L ...

  8. Linux进程管理 (2)CFS调度器

    关键词: 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 Linux进程管理 ( ...

  9. Linux进程管理 (7)实时调度

    关键词:RT.preempt_count.RT patch. 除了CFS调度器之外,还包括重要的实时调度器,有两种RR和FIFO调度策略.本章只是一个简单的介绍. 更详细的介绍参考<Linux进 ...

  10. Linux进程管理工具

    Linux进程管理工具 Htop yum install htop 参考帮助: http://blog.csdn.net/skh2015java/article/details/53173896 Li ...

随机推荐

  1. [网络/HTTPS/Java] PKI公钥基础设施体系、CA证书与认证工具(jre keytool / openssl)

    0 序 1 CA证书概述 说起 HTTP 的那些事,则不得不提 HTTPS ,而说起 HTTPS ,则不得不提数字证书. 本文将从 Java 的角度,学习 HTTPS 和数字证书技术. 1.1 访问 ...

  2. #链表#洛谷 3794 签到题IV

    题目 给出一个长度为\(n\)的数列\(a\),求 \[\sum_{i=1}^n\sum_{j=i}^n[\gcd(a_{i\sim j})\;xor\;or(a_{i\sim j})=k] \] 分 ...

  3. #树形dp,二次扫描换根法#洛谷 4284 [SHOI2014]概率充电器

    题目 分析 充电很难做,考虑判断不充电的概率, 设\(dp[x]\)表示点\(x\)无法充电的概率,但是这样有后效性, 考虑先处理子树内的问题,那么 \(dp[x]=(1-p[x])\prod_{y\ ...

  4. OpenAtom OpenHarmony分论坛,今天14:00见!附大事记精彩发布

    2022开放原子全球开源峰会 OpenAtom OpenHarmony分论坛 万物互联,使能千行百业 整装待发!精彩今日揭晓与您相约7月27日 14:00  

  5. SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用

    SQL NULL 值 什么是 NULL 值? NULL 值是指字段没有值的情况.如果表中的字段是可选的,那么可以插入新记录或更新记录而不向该字段添加值.此时,该字段将保存为 NULL 值.需要注意的是 ...

  6. 第一视角看方法调用时的jvm

    关于比较学术的jvm每个内存区域我之前都写过,就不重复赘述了,这里附上链接:https://www.cnblogs.com/gmt-hao/p/13603534.html, https://www.c ...

  7. 机器学习服务活体检测算法荣获CFCA权威安全认证

    随着人脸识别技术在金融.医疗等多个领域的加速落地,网络安全.信息泄露等问题愈为突出,用户对应用稳定性和安全性的要求也更为严格.为保障各行业高效稳定的开展业务,提前发现和应对潜在安全风险,HMS Cor ...

  8. 踩坑指南:入门OpenTenBase之部署篇

    引言 OpenTenBase 企业级分布式HTAP开源数据库,具备高扩展性.商业数据库语法兼容.分布式HTAP引擎.多级容灾和多维度资源隔离等能力,成功应用在金融.医疗.航天等行业的核心业务系统. 这 ...

  9. identity4 系列————用户数据持久化篇[六]

    前言 前面的例子已经将各种情形下的例子已经介绍了一遍,那么后面就是用户数据持久化该如何处理了. 正文 例子位置: https://github.com/IdentityServer/IdentityS ...

  10. 单链表之删除头结点,查找等于定值x的结点数,单链表的逆置

    /* * @Author: 一届书生 * @Date: 2020-03-08 09:52:27 * @LastEditTime: 2020-03-08 13:58:30 */ #include < ...