Linux内核开发三:多进程编程

2023-10-26

 

1 、什么是进程

 

我们可以通俗地把进程看作是正在运行着的二进制程序,占用内存空间消耗系统资源,例如使用 vim 命令编辑文件内容就会生成一个进程。进程是 OS 资源分配的基本单位,每个进程在操作系统中都执行着特定的任务。如网络服务/etc/init.d /network 是管理各个以太网接口的守护进程。

 

进程启动后,系统会为它分配一个唯一的数值,用于标识该进程,这个数值就称为进程号 PID,每个进程都有自己的用户、工作目录、进程状态、父子关系、内存结构、启动命令、文件句柄等情况,都记录在/proc/PID/目录下,通常使用 ps 命令和 top 命令查看。

 

2、c 语言的 main()函数

 

C 程序总是从 main 函数开始执行,通常情况下,对一个大型的软件项目,有几个 main()

 

就有几个进程。main()函数的原型是:int main(int argc,char* argv[1],char *env[]); argc 是命令行参数的个数,程序文件路径自身是第一个参数。 argv 字符指针数组中保存了指向各个参数字符串的指针,argv[0]就指向程序文件。

 

env 字符指针数组中保存了指向当前系统中每个环境变量字符串的指针,也就是环境表的首地址,环境表以 null 结尾,和命令 env 的输出一致。

 

void main ( int argc , char *argv[] ,char *env[] ) { int i ;
fprintf ( stdout , ” 参数个数 argc = %d\n ” , argc ) ;
 
for ( i = 0 ; i < argc ; i++ ) printf ( “ 参数 argv[%d] = %s \n ” , i , argv[i] ); for ( i = 0 ; env[i] ; i++ ) puts ( env[i] ) ; //逐个打印环境变量
 
}


 

3、Linux 进程的内存管理机制

 

Linux 进程内存管理的对象都是虚拟内存,每个进程先天就有 0-4G 的各自互不干涉的虚拟内存空间,0—3G 是用户空间执行用户自己的代码, 高 1GB 的空间是内核空间执行 Linu x 系统调用,这里存放在整个内核的代码和所有的内核模块。用户所看到和接触的都是该虚拟地址,并不是实际的物理内存地址。虚拟内存不能直接存储数据,必须要先映射真实物理内存,C 语言中内存动态分配函数 malloc 严格来说不是分配内存,而是用这先天就存在虚拟内存映射物理内存的。

 

Linux 内存分配和回收以内存页为单位,一页是 16 的 3 次方共 4096 个字节。进程的内存结构都保存在/proc/$(pid)/maps 文件中,下图为 Linux 进程典型存储器安排:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核开发三:多进程编程 的相关文章

  • OS X 对 /usr/local/lib 的权限被拒绝

    我正在寻找有关权限问题的任何建议 直觉 线索 答案 自从我切换到新的 Macbook Pro 以来 这个问题一直困扰着我 这就是困境 某些程序在安装期间复制 usr local lib 下的库 并且在运行这些程序时出现崩溃 我认为这与此文件
  • shell中基于正则表达式的颜色突出显示输出

    我想知道是否可以用颜色突出显示与某些字符串匹配的 shell 命令的输出 例如 如果我运行 myCommand 输出如下 gt myCommand DEBUG foo bar INFO bla bla ERROR yak yak 我希望所有
  • 如何在树莓派上更新到最新的 python 3.5.1 版本?

    我昨天拿到了 Raspberry Pi 我已经在尝试用它来编写代码了 我有一个计划在其上运行的程序 但它仅与 Python 版本 3 5 0 或 3 5 1 兼容 并且我在互联网上找到的所有内容似乎都已经过时 与 Python 2 有关 或
  • 对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

    该程序是在 Linux 上用 C 语言开发的客户端服务器套接字应用程序 每个客户端都连接到一个远程服务器并将其自身记录为在线 在任何给定时间点很可能有多个客户端在线 所有客户端都尝试连接到服务器以将自己记录为在线 忙碌 空闲等 那么服务器如
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • Python 线程与 Linux 中的多处理

    基于此question https stackoverflow com questions 807506 threads vs processes in linux我假设创建新流程应该几乎和创造新线程在Linux中 然而 很少的测试显示出截
  • 在linux中使用setcap [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 要将 cap net raw 功能添加到 例如 bin ping 我们使用以下命令 setcap cap net raw ep bin ping ep
  • 我如何知道 std::map 插入成功还是失败?

    我在多线程应用程序中有一个映射 将名为 uuid 的类映射到指针 我想知道插入操作是否成功或失败 e g mymap insert hint MyMap value type entry uuid itemptr 如果失败的话会抛出异常或者
  • gnutls_handshake() 失败:握手失败 GIT

    一切都工作正常 但突然我收到错误 致命 无法访问 https 电子邮件受保护 cdn cgi l email protection name repo name git gnutls handshake 失败 握手失败 我在我的计算机和 E
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • 我可以告诉 Linux 不要交换特定进程的内存吗?

    有没有办法告诉 Linux 它不应该将特定进程的内存交换到磁盘 它是一个 Java 应用程序 所以理想情况下我希望有一种方法可以从命令行执行此操作 我知道您可以将全局交换性设置为 0 但这明智吗 您可以通过以下方式执行此操作姆洛克尔 2 h
  • Tomcat 中的 403 访问被拒绝

    我有以下内容tomcat users xml
  • pip 找不到满足要求的版本 django==2.2.1

    我刚刚将操作系统更改为 linux 并且想安装 django 但我无法安装最新版本的 django 我努力了 pip install django 但是它安装了 django 1 11 11 这不是我需要的 我还将我的 pip 升级到了 1
  • AMD OpenCL 在 Linux 上工作所需的最小必要文件子集是什么?

    我已经使用 buildroot 构建了 Linux 内核 我已将开源 amdgpu 驱动程序和所需的固件合并到其中 驱动程序很好 检测 GPU 模式设置运行良好 调整 小文本 的分辨率 启动后会显示命令行 现在我需要运行 OpenCL 程序
  • 串口读取未完成

    下面的函数用于在Linux下从串口读取数据 我在调试时可以读取完整的数据 但是当我启动程序时 读缓冲区似乎并不完整 我正确接收了一小部分数据 但缓冲区的其余部分完全正确zero 可能是什么问题呢 int8 t serial port ope
  • 如何像C99一样使用make和编译?

    我正在尝试使用 Makefile 编译 Linux 内核模块 obj m main o all make C lib modules shell uname r build M PWD modules clean make C lib mo
  • 容器上的“container_memory_working_set_bytes”指标和 OOM-killer 之间有什么关系?

    我试图找出并理解 OOM killer 如何在容器上工作 为了弄清楚这一点 我读了很多文章 发现 OOM killer 会根据oom score And oom score是由oom score adj以及该进程的内存使用情况 有两个指标c
  • C:运行系统命令并获取输出? [复制]

    这个问题在这里已经有答案了 我想在 Linux 中运行一个命令并获取其输出内容的返回文本 但我do not想要将此文本打印到屏幕上 有没有比制作临时文件更优雅的方法 你想要 popen http linux die net man 3 po
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad

随机推荐

  • 支配世界的几个重要算法

    算法应当具有以下三大重要特征才被视为拥有实际效果 应该是有限的 算法应该在有限的时间内用有限的步骤解决掉其旨在解决的问题 也就是说算法必须在有限的时间内可以完成 要不然就没有现实意义 应该具有明确的指令 算法中的每个步骤必须经过精确定义 同
  • QT编译安装QtMqtt子模块,Linux平台

    QT安装QtMqtt子模块 include文件夹和src文件夹 lib文件夹 mkspecs文件夹 错误修改 总结 系统 Windows10 环境 QT5 12 9 源码下载和源码的编译请参考 QT编译安装QtMqtt子模块 WIN平台 网
  • SerialPort类的用法与示例

    SerialPort类的用法与示例 文章目录 SerialPort类的用法与示例 1 串口硬件信号定义 2 串口端口号搜索 3 串口属性参数设置 4 串口发送信息 5 串口接收信息 串口工具类 串口使用注意事项 从Microsoft Net
  • [技术发展-16]:高级研修班-智能制造-重构工业制造体系,构建智能化工业互联网平台

    目录 作者主页 https blog csdn net HiWangWenBing 文章出处 https blog csdn net HiWangWenBing article details 118277050 前言 第一章 工业互联网平
  • CART-分类和回归树

    之前在博文 决策树归纳 中 我介绍了用决策树进行分类的算法 包括ID3和C4 5 然而决策树不仅可以用来做数据分类 也可用于做数据回归 1984年Breiman Friedman Olshen等人出版了著作 Classification a
  • 数据库原理期末考试题(经典题型)

    一 单选题 题数 4 共 20 0 分 1 在数据库的三级模式结构中 描述数据库中数据的全局逻辑结构和特征的是 A 外模式 B 内模式 C 存储模式 D 模式 我的答案 D 2 公司中有多个部门和多名职员 每个职员只能属于一个部门 一个部门
  • 必须收藏的python兼职网站大全

    当下python需求量还是挺大的 对于想要做兼职的程序员还是挺友好的 起码不用愁找不到 目前来看 其兼职方向大致有三 开发 爬虫 数据分析 就开发来说 目前python的轮子在Github上一抓一大把 开发成本和开发周期相比于其他语言会更低
  • 【Java】自动拆箱与自动装箱

    自动装箱 自动拆箱是 JDK1 5 提供的功能 自动装箱是把一个基本类型的数据直接赋值给对应的包装类型 自动拆箱是把一个包装类型的对象直接赋值给对应的基本类型 通过自动装箱 拆箱功能 可以大大简化基本类型变量和包装类对象之间的转换过程 Ja
  • MSP430F5529库函数学习——串口

    波特率计算网站 导入MSP430Ware 查看例程 原理图和中文开发手册获取 目录 GPIO setAsPeripheralModuleFunctionInputPin 和GPIO setAsPeripheralModuleFunction
  • pythonlist函数使用方法_python中的list() 函数如何用?

    如果一个地区做统计工作 汉字或者其他东西就可以用数字事先写进去 比如 01代表汉族 那么你在写民族的时候有下拉列表 你就可以打01 就会自动识别为汉族 列表的使用便于计算 查找 分析 处理数据 在python中 有内置函数list 函数用于
  • python之flask框架(一)

    python基础部分咱们基本已经掌握 前面也了解了tkinter的基本用法 这次给大家讲解一下很常见的web框架 就是这个flask框架 其实 python的web框架不仅仅是flask 还有Django Weppy Bottle等还有很多
  • shell中临时使用其他用户执行命令

    问题来源于chinaunix博客论坛 感觉比较实用 整理过来了 我在root中执行一个脚本 但是其中的一些命令或脚本必须用oracle用户来执行 bin sh oracle用户执行 su oracle bin cd xxxx xxx bin
  • 云计算基础——云服务

    目录 云服务概述 云服务简介 云服务的产生和发展 云服务产生的前提 接入云端的主要前端工具 云服务的优缺点 优点 缺点 云服务的类型 SaaS PaaS IaaS 云部署模型 云服务概述 云服务简介 云计算通过使计算分布在大量的分布式计算机
  • I18N多文件数据参数动态获取

    在我们的项目中 控制层获取信息 没有用到ResourceBundle getBundle 而是labelcode 的方式 java I18N 如果有多个配置文件 是怎么读取这些信息的 在控制层怎么读取出相对应的信息出来 参数properti
  • 从零开始学web开发之html5-h5概述

    前言 为了掌握多一门技术 于是开始了学习前端技术的脚步 虽然安卓还是没有深入地学习一些比较高端的知识 比如view绘制原理 事件分发机制 属性动画的绘制 没有深入地研究一些流行框架 最遗憾的是没有将rxjava应用到自己的工作中 更加没有学
  • 元宇宙通证-序一:“元宇宙”和“后人类社会”

    序一 元宇宙 和 后人类社会 一 1992年 尼尔 斯蒂芬森的科幻小说 雪崩 促办 好评如潮 雪崩 描述的是脱胎于现实世界的一代互联网人对两个平行世界的感知和认识 但是 不论是做作 还是书评者 都没预见到在30年之后 此书提出的 元宇宙 M
  • 【微服务部署】四、Jenkins一键打包部署NodeJS(Vue)前端项目步骤详解

    本文介绍使用Jenkins一键将NodeJS Vue 前端项目打包并上传到生产环境服务器 这里使用的是直接打包静态页面 发送到远程服务器Nginx配置目录的方式 首先确保服务器环境配置好 安装Nginx 运行目录 日志存放目录等 一 服务器
  • Flutter GetX 状态管理,路由管理,智能依赖注入

    直接上网址 GetX 关于GetX GetX 是 Flutter 上的一个轻量且强大的解决方案 高性能的状态管理 智能的依赖注入和便捷的路由管理 GetX 有3个基本原则 性能 GetX 专注于性能和最小资源消耗 GetX 打包后的apk占
  • java 工具篇(MySQL数据库工具) 数据库实体创建

    第一步 生成工具源代码 package com mysql util import java io File import java io FileWriter import java io IOException import java
  • Linux内核开发三:多进程编程

    1 什么是进程 我们可以通俗地把进程看作是正在运行着的二进制程序 占用内存空间消耗系统资源 例如使用 vim 命令编辑文件内容就会生成一个进程 进程是 OS 资源分配的基本单位 每个进程在操作系统中都执行着特定的任务 如网络服务 etc i