Windows核心编程之多进程概述

2023-05-16

一、进程的概念
       进程是是一个正在运行的程序的实例(飘~~~),是系统分配资源的单位(线程是执行的单位),包括内存,打开的文件、处理机、外设等,进程由两部分组成:
      1、进程的内核对象:即我们通常所讲的PCB(进程控制块),该结构只能由该内核访问,他是操作系统用来管理进程的一个数据结构,操作系统通过该数据结构来感知和管理进程;它的成员负责维护进程的各种信息,包括进程的状态(创建、就绪、运行、睡眠、挂起、僵死等)、消息队列等;同时也是系统用来存放关于进程的统计信息的地方。
      注:具体结构参照Linux的task_struct数据结构。
      2、进程的地址空间:包含所有可执行模块或DLL模块的代码和数据,以及动态内存分配的空间,如线程堆栈和堆分配的空间。共有4G,0-2G为用户区,2-4G为系统区。
二、进程的创建过程
      1、系统创建进程内核对象(PCB进程控制块)。
      2、系统为新进程创建虚拟地址空间,帮将可执行文件或任何必要的DLL文件的代码和数据加载到该进程的地址空间。
      3、系统为新进程的主线程创建一个线程内核对象(TCB线程控制块)。
      4、通过执行C/C++运行期启动代码,该主线程开始运行。
      注:在Windows环境下,尽量用多线程而不是多进程。
三、与进程相关的API
1、创建进程
            BOOL CreateProcess(
                    PCTSTR      psApplicationName, //可执行文件的名字
                    PTSTR      pszCommandLine, //命令行字符串
                    PSECURITY_ATTRIBUTES psaProcess,   //进程对象的安全性
                    PSECURITY_ATTRIBUTES psaThread,   //线程对象的安全性
                    BOOL      bInheritHandles, //句柄可继承性
                    DWORD      fdwCreate,   //标识符(优先级)
                    PVOID      pvEnvironment, //指向环境字符串
                    PCTSTR      pszCurDir,   //子进程当前目录
                    PSTARTUPINFO    psiStartInfo,
                    PPROCESS_INFORMATION ppiProcInfo);   //进程线程句柄及ID
2、打开进程
            HANDLE OpenProcess(
                    DWORD dwDesiredAccess, //访问安全属性
                    BOOL bInheritHandle, //继承属性
                    DWORD hProcessId);   //进程ID
            注:获取hPronessId指定的进程的内核对象的句柄
3、终止进程
(1)、主线程的进入点函数返回
(2)、进程自己终止自己
              VOID ExitProcess(
                        UINT fuExitCode); //退出代码
(3)、终止自身进程或其他进程
              BOOL TerminateProcess(
                      HANDLE hProcess, //进程句柄
                      UINT fuExitCode); //退出代码
三、与进程相关的API
4、获取进程的可执行文件或DLL对应的句柄
              HMODULE GetModuleHandle(
                      PCTSTR pszModule); //模块名称
              注:当参数传NULL时获取的是进程的地址空间中可执行文件的基地址。
5、获取与指定窗口关联在一起的一个进程和线程标识符
              HANDLE GetWindowThreadProcessId(
                      HWND hWnd,    //窗口句柄
                      LPDWORD lpdwProcessId); //与该窗口相关的进程ID
6、获取进程的运行时间
              Bool GetProcessTimes(
                      HANDLE hProcess,   //进程句柄
                      PFILETIME pftCreationTime, //创建时间
                      PFILETIME pftExitTime, //退出时间
                      PFILETIME pftKernelTime, //内核时间
                      PFILETIME pftUserTime); //用户时间
              注:返回的时间适用于某个进程中的所有线程(甚至已经终止运行的线程)。
7、获取当前进程的一个伪句柄
              HANDLE GetCurrentProcess();
               注:该函数获取当前进程的伪句柄,通常情况值为-1,只能标识当前进程内核对象,
                      可以复制,但不可继承。不必调用CloseHandle()函数来关闭这个句柄。
8、将进程的伪句柄转换为实句柄
              HANDLE DuplicateHandle(
                      GetCurrentProcess(),
                      GetCurrentProcess(),
                      GetCurrentProcess(),
                      &hProcess,
                      0,
                      FALSE ,
                      DUPLICATE_SAME_ACCESS);
9、获取当前进程ID
              DWORD GetCurrentProcessId();
10、获取进程优先级
              DWORD GetPriorityClass(
                   HANDLE hProcess);
11、修改进程的优先级类
              BOOL SetPriorityClass(
                     HANDLE hProcess, //进程句柄
                     DWORD fdwPriority); //相对进程优先级
              注1:相对线程优先级
                     实时: REALTIME_PRIORITY_CLASS
                     高: HIGH_PRIORITY_CLASS
                     高于正常; ABOVE_NORMAL_PRIORITY_CLASS
                     正常: NORMAL_PRIORITY_CLASS
                     低于正常: BELOW_NORMAL_PRIORITY_CLASS
                     空闲: IDLE_PRIORITY_CLASS
              注2:只要拥有进程的句柄和足够的权限,就能够修改系统中运行的任何进程的优
                       先级类。
12、获取进程句柄计数
              BOOL GetProcessHandleCount(
                      HANDLE hProcess,   //句柄
                      PDWORD pdwHandleCount); //句柄计数
13、获取环境块
              DWORD GetEnvironmentVariable(
                      LPCTSTR lpName, //环境变量的名字
                      LPTSTR lpValue, //存放返回字符串的缓冲区
                      DWORD cchValue); //缓冲区的大小
              注:返回值为返回字符串的长度,当缓存不足时返回所需字符串的长度
14、设置环境块
              BOOL SetEnvironmentVariable(
                      LPCTSTR lpName, //环境变量的名字
                      LPCTSTR lpValue); //存放变量值字符串的缓冲区
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows核心编程之多进程概述 的相关文章

  • 使用 Windows 命令行连接文本文件,删除前导行

    我需要连接一些相对较大的文本文件 并且更喜欢通过命令行来完成此操作 不幸的是我只有Windows 无法安装新软件 type file1 txt file2 txt gt out txt 允许我几乎得到我想要的 但我不希望 file2 txt
  • 如何在子 shell 中运行 cmd.exe 批处理文件

    我有一个批处理文件 通常像这样调用 longjob cmd gt result txt 2 gt 1 这工作正常 但脚本在执行过程中更改了目录 将我的 shell 留在该目录中 这很麻烦 有没有办法在子 shell 中运行命令 同时仍然允许
  • Windows 睡眠功能极慢

    我正在通过 Windows h 使用 Sleep 命令制作一个程序 并且在 Windows 10 而不是 Windows 7 上运行我的程序时遇到了令人沮丧的差异 我将我的程序简化为下面的程序 它与我的更复杂的程序表现出相同的行为 在 Wi
  • opencv人脸检测示例

    当我在设备上运行应用程序时 应用程序崩溃并显示以下按摩 java lang UnsatisfiedLinkError 无法加载 detector based tracker findLibrary 返回 null 我正在使用 OpenCV
  • 提取证书中主题属性的所有值

    我目前正在使用CertGetNameString http msdn microsoft com en us library windows desktop aa376086 28v vs 85 29 aspx提取每个主题属性的值 如下所示
  • Rails Windows Vagrant 响应时间非常慢

    我在跑 Vagrant 1 7 1 Rails 4 1 4 Thin 1 6 1 Windows 7 每个静态文件的发送时间都超过一秒 在我的 PC 上加载一个页面可能需要大约 20 秒 而在同事的 Linux 机器上则只需瞬间 有一些帖子
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将
  • C# WMI 在远程 PC 上运行一个 exe,然后在同一台 PC 上运行另一个 exe,然后在网络路径上调用 Directory.CreateDirectory 并失败

    使用 C WMI 我在另一台计算机上启动一个 exe 该 exe 使用 C 启动另一个 exeProcess班级 最后一个 exe 尝试调用Directory CreateDirectory使用网络路径 又名 comp1 d dir Dir
  • 如何使用 Win32 API 与 com 端口 (RS232) 通信

    我正在尝试使用 win32 API 与 com 端口对话 我找到了这个http www robbayer com files serial win pdf http www robbayer com files serial win pdf
  • 仅在单个端口 8080 上转发到本地主机(Windows)可能吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我知道如何在 Windows 上使用 xampp 设置本地网络服务器 我在主机文件 c windows system32 drivers etc ho
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • Windows 上的递归移动命令

    我需要做一个 sh 的 bat 副本 我不太了解 Windows cmd 在 Linux 上我可以做 mv or rsync a SOURCE DEST remove sent files ignore existing whole fil
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • Windows 窗体中的标准 Windows 菜单栏

    我注意到添加了一个MenuStrip 来自工具箱 我的表单设计不会产生像许多本机 Windows 应用程序中那样的菜单栏 相反 我得到了一个像 Visual Studio 自己的菜单栏 没有任何样式设置MenuStrip似乎模仿了更常见的本
  • Windows 上的 ffmpeg-android ndk

    我正在尝试编译 bash 文件 带有 android ndk 的 ffmpeg 我收到如下错误 arm linux androideabi gcc 无法创建可执行文件 C 编译器测试失败 Makefile 2 config mak 没有这样
  • 如何在Windows服务器上将node.js文件作为后台进程运行?

    我正在创建一个 node js 项目并将其上传到我的 Windows 服务器 以为移动应用程序提供 API 服务 当我打开命令提示符并键入 node app js 它运行正常 但是当我关闭命令提示符时 我的 Node js 服务器停止运行
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 什么是 SO_SNDBUF 和 SO_RCVBUF

    你能解释一下到底是什么吗SO SNDBUF and SO RCVBUF选项 好的 出于某种原因 操作系统缓冲传出 传入数据 但我想澄清这个主题 他们的角色 通 常 是什么 它们是每个套接字的缓冲区吗 传输层的缓冲区 例如 TCP 缓冲区 和
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt

随机推荐

  • 【Android】移动端接入Cronet实践

    移动端接入Cronet实践 QUIC协议获取Chromium源码编译CronetAndroid iOS buildsDesktop builds targets the current OS Running the ninja files生
  • Linux系统下安装Java环境

    目录 测试环境 下载JDK 终端模拟软件 安装前准备 tar包的安装方法 tar包的卸载 rpm包的安装方法 rpm包的卸载 测试环境 LInux系统版本 xff1a CentOS 7 64位 终端模拟软件 xff1a Xshell 6 J
  • 【Hexo】Hexo个人博客绑定域名

    Hexo个人博客绑定域名 当我们在用hexo搭建了个人博客之后 xff0c 用username github io访问难免有些奇怪 xff0c 下面就花3分钟时间对如何绑定个人域名进行描述 我这边是在阿里云买的一个域名 xff0c ycbl
  • 生产者消费者的代码实现

    当消费者获得的数据为大写字母时 xff0c 则把大写字母转换成小写字母 xff0c 并显示 xff1b 当消费者获得的数据为小写字母时 xff0c 则把小写字母转换成大写字母 xff0c 并显示 xff1b 当消费者获得的数据为字符0 1
  • 基于RobHess的SIFT图像拼接知识点随笔

    1 SIFT算法具有尺度不变性在于构建的高斯尺度空间 xff1b 2 SIFT算法具有旋转不变性在于特征方向向量 xff1b 3 K d数以图像特征点的128维特征描述子均值为依据进行划分 构建 xff1b 4 特征点匹配是一个图像的所有特
  • 最小二乘法及OpenCv函数

    1 最小二乘法 我们以最简单的一元线性模型来解释最小二乘法 什么是一元线性模型呢 xff1f 监督学习中 xff0c 如果预测的变量是离散的 xff0c 我们称其为分类 xff08 如决策树 xff0c 支持向量机等 xff09 xff0c
  • Linux服务器网络不通情况分析以及常见检查方法

    在实际运维过程中 xff0c 经常会遇到网路不通的问题 xff0c 一般此类网络不通的问题都是业务端到端的排查 本文从后端linux服务器端自查是否服务器问题 通过多年的运维经验总结 xff0c 服务器端问题导致网络不通 xff0c 大致分
  • RANSAC算法实现去除误匹配并计算拼接矩阵-随笔

    1 RANSAC算法实现去除误匹配并计算拼接矩阵流程 1 从样本集中随机抽选一个RANSAC样本 xff0c 即4个匹配点对 xff08 至少4个匹配点对 xff0c 才能计算出3 3变换矩阵 xff09 xff1b 2 计算当错误概率为0
  • linux c++ 服务器端开发面试必看书籍

    由于很多朋友希望加入到Linux c 43 43 服务器端开发的队伍中 xff0c 本人就结合自己的面试经历并整理了自己阅读的相关书籍 xff0c 同大家分享 xff0c 一起进步 人个认为以下是进入这个方向的必看书籍 xff0c 各系列难
  • C++进阶—>const、define和enum的区别和用途

    1 区别 这三种都可以定义常量 define是宏定义 xff0c 编译器不对其进行错误检查 xff0c 在预编译阶段处理 xff0c 没有作用域限制属于全局常量 xff0c 在程序中编译器会对定义的常量名以数值进行替换 xff0c 且每次替
  • MFC中基于OpenCV实现Picture Control控件成像方法

    MFC中基于OpenCV实现Picture Control控件成像方法有两种 xff0c 一种是OpenCV2 2以前版本的绘制 xff0c 另外一种是OpenCV2 2以后版本的绘制 xff08 1 xff09 在OpenCV2 2之前的
  • MFC中CFileDialog及SHBrowseForFolder

    MFC中实现通过按钮来选择文件路径或文件夹路径 xff1b xff08 1 xff09 CFileDialog类能够选择文件 xff0c 并获取其路径 xff08 当然也可以通过获取文件路径再去除文件名而获得其所在文件夹路径 xff0c 前
  • C++进阶—>带你理解多字节编码与Unicode码

    本篇文章将讲解C 43 43 开发中容易混淆的另一个概念 多字节字符集与Unicode字符集 多字节字符与宽字节字符 char与wchar t 我们知道C 43 43 基本数据类型中表示字符的有两种 xff1a char wchar t c
  • BP神经网络及其C++实现

    0 前言 神经网络在我印象中一直比较神秘 xff0c 正好最近学习了神经网络 xff0c 特别是对Bp神经网络有了比较深入的了解 xff0c 因此 xff0c 总结以下心得 xff0c 希望对后来者有所帮助 神经网络在机器学习中应用比较广泛
  • C++进阶—>Socket通信那点事

    1 网络中进程之间如何通信 xff1f 本地的进程间通信 xff08 IPC xff09 有很多种方式 xff0c 但可以总结为下面4类 xff1a 消息传递 xff08 管道 FIFO 消息队列 xff09 同步 xff08 互斥量 条件
  • C++进阶—>线程同步随笔

    线程同步主要有五种方法 xff1a 原子访问 xff0c 临界区 xff0c 信号量 xff0c 事件和互斥量 xff1b 其中原子访问和临界区属于用户模式的同步 xff1b 信号量 xff0c 事件和互斥量属于内核模式的同步 原子访问是通
  • C++进阶—>_beginthreadex和CreateThread的区别和联系

    beginthread 和 CreateThread 的区别 转自 http wenku baidu com view adede4ec4afe04a1b071dea4 html 程序员对于Windows程序中应该用 beginthread
  • idea src下源文件和class编译文件不一致

    今天遇到一个神奇BUG xff0c 一个和elasticsearch没有任何关系的项目 xff0c 报错ES某个包找不到 xff0c 刚开始以为是依赖了父项目的某个包 xff0c 并且本项目主启动类ComponentScan扫描了相关的类进
  • C++进阶—>Win32 多线程的创建方法和基本使用

    Summary From xff1a https software intel com zh cn blogs 2011 12 02 win32 cid 61 sw prccsdn2086 总结Win32提供的创建多线程相关的API接口和基
  • Windows核心编程之多进程概述

    一 进程的概念 进程是是一个正在运行的程序的实例 xff08 飘 xff5e xff5e xff5e xff09 xff0c 是系统分配资源的单位 线程是执行的单位 xff0c 包括内存 xff0c 打开的文件 处理机 外设等 xff0c