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;
}
相关推荐
怪兽软家37 分钟前
DaVinci Resolve/达芬奇 20安装教程及下载
windows·经验分享·生活
chao18984441 分钟前
完整MES系统实现 (C# 客户端服务器)
服务器·windows·c#
Hello_Embed2 小时前
Windows 安装 Claude Code 并接入 模型
windows·笔记·ai编程
Muyuan19982 小时前
28.Paper RAG Agent 开发记录:修复 LLM Rerank 的解析、Fallback 与可验证性
linux·人工智能·windows·python·django·fastapi
AxureMost4 小时前
4DDiG DLL Fixe 1.0.8.2 系统DLL修复工具
windows
怣疯knight6 小时前
Windows不安装 Android Studio如何打包安卓软件
android·windows·android studio
空中海6 小时前
02. 静态逆向、Manifest 分析与 Smali 重打包
服务器·网络·windows
一拳一个娘娘腔6 小时前
告别图形化界面:基于CLI的Windows系统入侵排查与防御实战手册
windows·安全
疋瓞7 小时前
批处理_基础补充、文件和文件夹处理_02
windows
nudt_qxx8 小时前
Ubuntu 24.04/26.04 与 Windows 10/11 双系统时间不同步终极解决方案
windows·stm32·ubuntu