进程间在0到255之间的唯一数字

Unique number between 0 to 255 across the processes

本文关键字:之间 唯一 数字 进程      更新时间:2023-10-16

是否有办法生成0到255之间唯一的数字?这个数字在各个进程中必须是唯一的。因此,如果我的应用程序有多个实例,每个实例将获得一个在0到255之间的唯一数字。当然,我的应用程序最多可以有256个实例。

正如Brad建议的那样,使用文件总是一个选项。但我想知道是否有任何windows API这样做?

这是我可以在c++中做的吗?

在Windows上,您可以在DLL中创建共享内存或共享数据段。由于您正在共享来自单个DLL的单个整数,因此使用共享数据段可能会更简单。

#pragma data_seg (".myseg")
   int sharedCounter = 0; 
#pragma data_seg() 

你需要使用一个互锁函数来访问它,因为它是跨进程共享的:

int myAppId = InterlockedIncrement(&sharedCounter);

正如其他人建议的,您可以使用共享内存在进程之间交换数据。

因为您只对0-255之间的唯一ID感兴趣,并且我假设任何给定的ID在进程使用它之后都可以被重用(因此256个并发进程之间的唯一ID,对吗?)如果是这样,您可以在共享内存中存储一个包含256个元素的布尔数组,当一个新进程加载DLL时,它可以在数组中查找一个可用的插槽,将其设置为true,并使用插槽索引作为它的唯一ID。卸载DLL时,让它将数组槽重置为false,以供以后的进程使用。您可以通过CreateMutex()使用命名互斥锁来同步跨进程对数组的访问。

像这样:

#pragma data_seg (".myseg")
bool AppsInUse[256] = {0};
#pragma data_seg()
HANDLE hMutex = NULL;
int UniqueID = -1;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
    switch( fdwReason ) 
    { 
        case DLL_PROCESS_ATTACH:
            DisableThreadLibraryCalls(hinstDLL);
            hMutex = CreateMutex(NULL, FALSE, TEXT("MyMutex"));
            if (hMutex == NULL)
                return FALSE;
            if (WaitForSingleObject(hMutex, 5000) == WAIT_OBJECT_0)
            {
                for (int i = 0; i < 256; ++i)
                {
                    if (!AppsInUse[i])
                    {
                        AppsInUse[i] = true;
                        UniqueID = i;
                        break;
                    }
                }
                ReleaseMutex(hMutex);
            }
            if (UniqueID == -1)
                return FALSE;
            break;
        case DLL_PROCESS_DETACH:
            if (UniqueID != -1)
            {
                if (WaitForSingleObject(hMutex, 1000) == WAIT_OBJECT_0)
                {
                    AppsInUse[UniqueID] = false;
                    ReleaseMutex(hMutex);
                }
                UniqueID = -1;
            }
            if (hMutex != NULL)
            {
                CloseHandle(hMutex);
                hMutex = NULL;
            }
            break;
    }
    return TRUE;
}

如果你的编译器不支持#pragma data_seg,你可以使用CreateFileMapping()MapViewOfFile()来动态分配共享数组:

HANDLE hMapping = NULL;
bool* AppsInUse = NULL;
HANDLE hMutex = NULL;
int UniqueID = -1;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
    switch( fdwReason ) 
    { 
        case DLL_PROCESS_ATTACH:
        {
            DisableThreadLibraryCalls(hinstDLL);
            hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(bool) * 256, TEXT("MyArray"));
            if (hMapping == NULL)
                return FALSE;
            bool bDoInit = (GetLastError() != ERROR_ALREADY_EXISTS);
            AppsInUse = (bool*) MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, sizeof(bool) * 256);
            if (AppsInUse == NULL)
                return FALSE;
            if (bDoInit) ZeroMemory(AppsInUse, sizeof(bool) * 256);
            hMutex = CreateMutex(NULL, FALSE, TEXT("MyMutex"));
            if (hMutex == NULL)
                return FALSE;
            if (WaitForSingleObject(hMutex, 5000) == WAIT_OBJECT_0)
            {
                for (int i = 0; i < 256; ++i)
                {
                    if (!AppsInUse[i])
                    {
                        AppsInUse[i] = true;
                        UniqueID = i;
                        break;
                    }
                }
                ReleaseMutex(hMutex);
            }
            if (UniqueID == -1)
                return FALSE;
            break;
        }
        case DLL_PROCESS_DETACH:
            if (UniqueID != -1)
            {
                if (WaitForSingleObject(hMutex, 1000) == WAIT_OBJECT_0)
                {
                    AppsInUse[UniqueID] = false;
                    ReleaseMutex(hMutex);
                }
                UniqueID = -1;
            }
            if (AppsInUse != NULL)
            {
                UnmapViewOfFile(AppsInUse);
                AppsInUse = NULL;
            }
            if (hMapping != NULL)
            {
                CloseHandle(hMapping);
                hMapping = NULL;
            }
            if (hMutex != NULL)
            {
                CloseHandle(hMutex);
                hMutex = NULL;
            }
            break;
    }
    return TRUE;
}

不是由c++结构指定的。但是,您可以将当前的数字保存在一个文件中,当进程启动时,您可以读取该文件并增加该数字。您需要对文件进行锁定,这样两个进程就不会同时更新它。你还需要一种方法来检测一个进程,如果它是同类中唯一的一个,并重新开始。

如何实现这两个最后的要求可能会被证明是特定于你的语言和操作系统。