Linux系统基础——程序和进程

news2024/12/25 1:20:51

代码,程序,进程

特此说明: 刘超的趣谈linux操作系统是比较重要的参考资料,本文大部分内容和图片来源于这个专栏。

1 实验环境

运行一个demo,主要功能是主进程通过系统调用fork一个新的进程,子进程功能是加载二进制文件,运行ls命令。

1.1 代码: 文本文件

1、 目录结构

[root@VM_16_8_centos test]# tree .
.
|-- createprocess.c
`-- process.c

0 directories, 2 files

2、 编辑&编译&运行

// process.c
#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 (); // 1.创建子进程
        if (child_pid != 0)
                return child_pid;
        else {
                execvp (program, arg_list); //2.子进程通过execvp去运行一个新的程序
                abort ();
        }
}
// createprocess.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

extern int create_process (char* program, char** arg_list);

int main ()
{
    char* arg_list[] = {
        "ls",
        "-l",
        "/etc/yum.repos.d/",
        NULL
    };
    create_process ("ls", arg_list);    //让子进程执行ls命令
    return 0;
}

1.2 程序: 二进制文件


#### 第一种方式 ####

# 编译成.o文件
gcc -c -fPIC process.c
gcc -c -fPIC createprocess.c
# 生成库文件
ar cr libstaticprocess.a process.o # process.o编译成静态库
# 链接为可执行文件
gcc -o staticcreateprocess createprocess.o -L. -lstaticprocess


#### 第二种方式 ####

# 编译成.o文件
gcc -c -fPIC process.c
gcc -c -fPIC createprocess.c
# 生成库文件
gcc -shared -fPIC -o libdynamicprocess.so process.o  # process.o编译成共享库
# 链接为可执行文件
gcc -o dynamiccreateprocess createprocess.o -L. -ldynamicprocess

1.3 进程: 运行时

#### 第一种方式 ####
$ ./staticcreateprocess
$ total 40
-rw-r--r--. 1 root root 1572 Oct 24 18:38 CentOS-Base.repo
......

#### 第二种方式 ####
$ export LD_LIBRARY_PATH=.
$ ./dynamiccreateprocess
$ total 40
-rw-r--r--. 1 root root 1572 Oct 24 18:38 CentOS-Base.repo
......

2 过程分析

2.1 总体框图

代码经过编译和链接生成ELF格式的可执行文件,进程通过exec系列系统调用,将可执行文件加载到内存中执行。

在这里插入图片描述

图右边的文件编译过程,生成 so 文件和可执行文件,后面对部分内容整理。

图左边对刚才的代码进行补充:用户态的进程 A 执行 fork,创建进程 B,在进程 B 的处理逻辑中,执行 exec 系列系统调用。这个系统调用会通过 load_elf_binary 方法,将刚才生成的可执行文件,加载到进程 B 的内存中执行。

2.2 编译和链接

1、文本文件转换到二进制文件

编译工具链将我们写好的代码转换成二进制文件,在Linux系统中识别的是elf格式的二进制文件。大致流程为

在这里插入图片描述

elf格式有可重定位文件可执行文件动态链接库几种类型。

2.3 运行程序为进程

如何将elf格式的二进制程序加载到内存运行的呢?
1、 内核源码
内核中定义加载二进制文件的方法

struct linux_binfmt {
        struct list_head lh;
        struct module *module;
        int (*load_binary)(struct linux_binprm *);
        int (*load_shlib)(struct file *);
        int (*core_dump)(struct coredump_params *cprm);
        unsigned long min_coredump;     /* minimal dump size */
} __randomize_layout;

对于 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,
};

对于方法load_elf_binary,源码中有调用链: do_execve->do_execveat_common->exec_binprm->search_binary_handler。

do_execve其实被一组exec的系统调用实现

SYSCALL_DEFINE3(execve,
    const char __user *, filename,
    const char __user *const __user *, argv,
    const char __user *const __user *, envp)
{
  return do_execve(getname(filename), argv, envp);
}

2、 理解

之前子进程代码中执行了方法exec,运行一个elf文件。其实通过命令行执行一个程序的时候,也有类似的实现。通过strace命令查看其中一个命令执行了哪些系统调用

[root@VM_16_8_centos demo]# strace ls
execve("/usr/bin/ls", ["ls"], [/* 28 vars */]) = 0
brk(NULL)                               = 0xb87000
....

2.4 fork新进程

所有进程都是从父进程fork过来的,那总归有一个祖宗进程,这就是咱们系统启动的init进程。下面是linux进程树,也可以通过ps -ef命令查看

在这里插入图片描述

2.5 补充知识

1、 了解ELF文件格式
ELF格式有可重定位文件可执行文件动态链接库几种类型。

  • 第一种是可重定位文件,也就是代码编译后生成的.o文件,这类文件还没有被链接,所以相当于一个代码片段。
  • 第二种是可执行文件,链接后的程序,可直接加载到虚拟内存上运行的一类文件。
  • 第三种是动态链接库,生成的库文件,动态库能被多个程序共享。程序并没有将动态库的代码包含进去(静态库的方式),相当于仅仅包括对动态链接库的引用。

2、 了解Linux系统中的进程,如查看进程
命令ps -ef查看Linux系统中的进程

[root@VM_16_8_centos demo]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Mar01 ?        00:05:19 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2     0  0 Mar01 ?        00:00:00 [kthreadd]
root         3     2  0 Mar01 ?        00:01:40 [ksoftirqd/0]
root         5     2  0 Mar01 ?        00:00:00 [kworker/0:0H]
root         7     2  0 Mar01 ?        00:00:00 [migration/0]
root         8     2  0 Mar01 ?        00:00:00 [rcu_bh]
root         9     2  0 Mar01 ?        00:04:46 [rcu_sched]
root        10     2  0 Mar01 ?        00:00:00 [lru-add-drain]
root        11     2  0 Mar01 ?        00:00:16 [watchdog/0]
root        13     2  0 Mar01 ?        00:00:00 [kdevtmpfs]
....

3、 几种查看文件格式的工具

  • readelf 工具用于分析 ELF 的信息,
  • objdump 工具用来显示二进制文件的信息,
  • hexdump 工具用来查看文件的十六进制编码,
  • nm 工具用来显示关于指定文件中符号的信息。

9 References

  • https://time.geekbang.org/column/article/90855

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

背包模型~

背包模型 概述 ​ 最长上升子序列&#xff1a;序列DP&#xff08;相邻两个被选择的有关系&#xff09; 背包问题&#xff1a;组合DP&#xff0c;在全局的考虑之下最小 f[i][j]&#xff1a;i 表示搞了多少&#xff0c;j 表示限制 集合&#xff1a;所有仅仅从前 i 个物品当…

论文推荐:CCNet用于语义分割的交叉注意力

CCNet&#xff0c; Transformer递归交叉自注意力&#xff0c;比非局部神经网络更有效。华中科技大学、地平线、ReLER 和伊利诺伊大学香槟分校联合研发 论文提出了交叉网络 (CCNet)&#xff0c;对于每个像素&#xff0c;CCNet 中的一个新的交叉注意力模块收集其交叉路径上所有像…

智慧路口:未来都市的智能节点

摘要交通路口是部署未来智慧城市的计算、通信和情报服务的最合适地点。需要收集和处理的大量数据&#xff0c;再加上隐私和安全问题&#xff0c;促使边缘计算范式的使用&#xff0c;这种范式与大都市的物理交叉路口很好地吻合。本文主要针对高带宽、低时延的应用&#xff0c;在…

2007-2022年消费者信心、满意度、预期指数月度数据(CCI、CEI、CSI、CGPI)

根据企业商品价格指数与消费者信心指数、消费者满意指数、消费者预期指数的月度数据&#xff0c;可以探究商品价格对消费者信心的影响作用和作用机制。 商品价格与消费者信心的三类细分指数均具有滞后二阶关联&#xff0c;其中&#xff0c;商品价格对对消费者预期指数的影响作…

IndexedDB的包装器JsStore - 实现登录功能及事务处理

JsStore是IndexedDB的包装器。它提供了简单的SQL像api&#xff0c;这是容易学习和使用。 IndexedDb查询可以在web worker内部执行&#xff0c;JsStore通过提供一个单独的worker文件来保持这种功能。 最近有位叫Pioneer网友一直在问我关于事务的实现方式&#xff0c;关于…

谷粒学院——Day13【微信扫描登录】

OAuth2 OAuth2的使用场景 一、OAuth2解决什么问题 1. OAuth2提出的背景 照片拥有者想要在云冲印服务上打印照片&#xff0c;云冲印服务需要访问云存储服务上的资源。 2. 图例 资源拥有者&#xff1a;照片拥有者。 客户应用&#xff1a;云冲印。 受保护的资源&#xff…

Python pandas库|任凭弱水三千,我只取一瓢饮(2)

上一篇链接&#xff1a; Python pandas库&#xff5c;任凭弱水三千&#xff0c;我只取一瓢饮&#xff08;2&#xff09;_Hann Yang的博客-CSDN博客 I~Q&#xff1a; Function10~25 Types[Function][9:25] [infer_freq, interval_range, isna, isnull, json_normalize, lres…

④【Maven】Maven的构建命令

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Maven的构建命令一、注意二、&#x1f680;清理…

指针与数组的联系与区别【一万六千字超详解】

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言数组的性质1.1 数组的内存布局1…

第四章 Spring的基础用法

文章目录 Spring的起源和背景理解依赖注入Spring容器理解Spring容器中的Bean管理容器中的Bean及其依赖注入自动装配使用Java类进行配置管理使用静态工厂、实例工厂创建Bean实例抽象Bean与子Bean容器中的工厂Bean管理Bean的生命周期几种特殊的依赖注入Spring的简化配置SpEL的功…

kali中间人攻击

数据来源 一、中间人攻击原理 1. 利用的ARP协议的漏洞 2. ARP协议原理&#xff1a; 1&#xff09;发送ARP广播请求目标MAC地址 2&#xff09;目标主机发送ARP单播应答&#xff0c;响应MAC地址 3. ARP攻击原理 攻击人通过发送虚假的ARP应答实现ARP缓存投毒!而受害人没有办法进行…

文件存储案例

1.文件存储-File文件存储案例 1.1.案例要求 1.2参考代码 文件读取 百度安全验证 文件最终的保存的目录在/data/data/user/0/包/files下&#xff08;1&#xff09;布局文件 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android&q…

kubernetes中使用Service反向代理外部服务

当我们的某个服务在外部集群的时候&#xff0c;但是又想k8s集群内的应用连接它&#xff0c;这是可以创建一个service&#xff0c;用service代理外部服务&#xff0c;然后集群内就能连接该service&#xff0c;从而间接的访问外部服务。 创建一个service代理外部的服务 创建一个…

代码挑战画 魔法圣诞树

一、前言 本文会基于C# GDI技术 从零到一 实现一颗 魔法圣诞树&#xff01;源码和素材在文末全部都有&#xff01; 二、魔法圣诞树 对于用代码画圣诞树&#xff0c;网上各种编程语言像python、css、java、c/c我们都有见到过了&#xff0c;那么在绘图方面&#xff0c;还有一位…

FastDDS(6)核心库综述

Fast DDS(前身为Fast RTPS)是DDS规范的高效高性能实现,DDS规范是一种用于分布式应用软件的以数据为中心的通信中间件(DCPS)。本次回顾Fast DDS的体系结构、操作和关键特性。 架构 Fast DDS的架构如下图所示,其中可以看到具有以下不同环境的层模型。 Application layer应…

人员工装未穿戴识别检测 opencv

人员工装未穿戴识别检测基于OpenCvyolo计算机视觉深度学习技术对现场画面中人员行为着装穿戴实时监测识别&#xff0c;发现不按要求着装违规行为立即抓拍存档同步后台。OpenCV-Python使用Numpy&#xff0c;这是一个高度优化的数据库操作库&#xff0c;具有MATLAB风格的语法。所…

RabbitMQ 第一天 基础 1 MQ的基本概念 1.4 MQ 的劣势 1.5 常见的MQ 产品

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础1 MQ的基本概念1.4 MQ 的劣势1.4.1 MQ 的劣势1.4.2 小结1.5 常见的MQ 产品第一天 基础 1 MQ的基本概念 1.4 MQ 的劣势 1.4.1 MQ 的劣势 从远程调用 到 利用 MQ 作…

css实现九宫格

首先是实现九宫格的样式&#xff0c;对每一行进行偏移&#xff0c;当鼠标放上去会使他们形成一张图片。 html <div class"img_container"><div class"img1"></div><div class"img1"></div><div class"i…

2022年,来者犹可追

始料未及的是&#xff0c; 疫情持续到了2022年。好在“大疫不过三年”&#xff0c;只不过是结束来的同样措不及防&#xff0c;全家的一次高烧免疫&#xff0c;没有朋友圈中的云淡风轻&#xff0c;冷暖自知&#xff0c;希望明年能够拥有平安喜乐的时光。回首这一年&#xff0c;“…

kotlin与java实现混编基础看这篇就够了

前几年一直关注安卓&#xff0c;想换个方向&#xff0c;奔着移动端大步向前&#xff0c;由于比较懒就一直停留在想法&#xff0c;这不今天勤快点&#xff0c;动手搞了一个基础的java和kotlin混编&#xff0c;和大家总结分享一下。 首先需要了解什么事kotlin&#xff0c;kotlin…