Windows同步技术-使用命名对象

在 Windows 系统下使用命名对象(如互斥体、事件、信号量、文件映射等内核对象)时,需注意以下关键要点:

命名规则

唯一性:名称需全局唯一,避免与其他应用或系统对象冲突,建议使用 GUID 或应用专属前缀(如 MyApp_SharedData)。

命名格式:名称可包含反斜杠 \,但避免使用特殊字符。若需跨会话或全局访问,需前缀 Global\ 或 Local\(默认作用域为会话内)。

作用域控制

会话内作用域:默认情况下,命名对象仅在当前用户会话内可见(隐式前缀为 Local\)。

全局作用域:使用 Global\ 前缀(如 Global\MyMutex)可使对象跨会话访问(常用于服务进程与用户进程通信)。

权限限制:访问全局对象可能需要管理员权限(Windows Vista+ 的安全机制)。

对象存在性检查

创建时检查:通过 Create* 函数(如 CreateMutex)的返回值及 GetLastError() 判断对象是否已存在(例如 ERROR_ALREADY_EXISTS)。

打开现有对象:使用 Open* 函数(如 OpenEvent)时,需确保对象已存在,否则返回 NULL。

原子性操作:多进程并发创建时需处理竞态条件。

安全性设置

安全描述符:通过 SECURITY_ATTRIBUTES 结构指定对象的访问权限,避免未经授权的进程访问。

继承性:若需子进程继承句柄,设置 bInheritHandle = TRUE。

资源管理

句柄关闭:使用 CloseHandle() 及时释放对象引用,避免资源泄漏。

生命周期:对象由内核管理,当所有句柄关闭后自动销毁(即使进程意外终止)。

示例代码

第一个进程使用 CreateMutex 函数创建互斥对象。 请注意,即使存在同名的现有对象,此函数也会成功。

复制代码
#include <windows.h>
#include <stdio.h>
#include <conio.h>

// This process creates the mutex object.

int main(void)
{
    HANDLE hMutex; 

    hMutex = CreateMutex( 
        NULL,                        // default security descriptor
        FALSE,                       // mutex not owned
        TEXT("NameOfMutexObject"));  // object name

    if (hMutex == NULL) 
        printf("CreateMutex error: %d\n", GetLastError() ); 
    else 
        if ( GetLastError() == ERROR_ALREADY_EXISTS ) 
            printf("CreateMutex opened an existing mutex\n"); 
        else printf("CreateMutex created a new mutex.\n");

    // Keep this process around until the second process is run
    _getch();

    CloseHandle(hMutex);

    return 0;
}

第二个进程使用 OpenMutex 函数打开现有互斥体的句柄。 如果不存在具有指定名称的互斥对象,则此函数将失败。 access 参数请求对互斥体对象的完全访问权限,这是在任何等待函数中使用的句柄所必需的。

复制代码
#include <windows.h>
#include <stdio.h>

// This process opens a handle to a mutex created by another process.

int main(void)
{
    HANDLE hMutex; 

    hMutex = OpenMutex( 
        MUTEX_ALL_ACCESS,            // request full access
        FALSE,                       // handle not inheritable
        TEXT("NameOfMutexObject"));  // object name

    if (hMutex == NULL) 
        printf("OpenMutex error: %d\n", GetLastError() );
    else printf("OpenMutex successfully opened the mutex.\n");

    CloseHandle(hMutex);

    return 0;
}
相关推荐
Frag0ut22 分钟前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm
数安旭说1 小时前
企业终端安全实战:Windows软件管控、正版检测、变更审计与私有软件库落地
windows·企业安全·软件需求·终端安全·软件管理·正版检测·终端审计
小羊没烦恼!3 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
玖石书3 小时前
python-uv-windows环境安装方案
windows·python·uv
程序员老陆3 小时前
WIN32_LEAN_AND_MEAN:Windows 头文件里的“精简编译开关”
c++·windows
玖石书3 小时前
LVGL的windows开发环境安装指南
windows·数字人·lvgl·仿真
qetfw4 小时前
Windows Server AD CS:根 CA、Web 证书模板与域内自动注册
前端·windows·windows-server
sukalot5 小时前
Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(三)
windows·驱动开发
硫酸锌016 小时前
在手机上运行Python增量备份手机数据到PC电脑
android·windows·python
java_logo6 小时前
Docker 部署 dockurr/windows:轻松搭建浏览器可控 Windows 虚拟机
运维·windows·docker·容器·虚拟机·kvm·轩辕镜像