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内核开发三:多进程编程 的相关文章

  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

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

    算法应当具有以下三大重要特征才被视为拥有实际效果 应该是有限的 算法应该在有限的时间内用有限的步骤解决掉其旨在解决的问题 也就是说算法必须在有限的时间内可以完成 要不然就没有现实意义 应该具有明确的指令 算法中的每个步骤必须经过精确定义 同
  • 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