C++ 如何避免与使用共享内存和信号量的其他程序冲突

C++ 如何避免与使用共享内存和信号量的其他程序冲突,c++,ipc,semaphore,shared-memory,conflict,C++,Ipc,Semaphore,Shared Memory,Conflict,我有一个程序,它使用共享内存并用信号量保护它,以便与同一程序的其他实例通信。我担心共享内存和信号量的安全性 我如何才能确保我使用的信号量和shm不会被其他程序打开,从而使它陷入混乱?有一种方法可以在单独的用户和他自己的用户组下运行程序,并通过限制共享对象只能由该用户和组访问来保护它们。这就是我的问题的答案,还是说窗户上有陷阱 如果我必须在同一个用户下运行所有程序,或者如果某些程序是以root用户身份运行的(总是有这样的程序,不是吗),有什么方法可以保护它们吗 我首先为所有想要一起通信的实例设置一

我有一个程序,它使用共享内存并用信号量保护它,以便与同一程序的其他实例通信。我担心共享内存和信号量的安全性

  • 我如何才能确保我使用的信号量和shm不会被其他程序打开,从而使它陷入混乱?有一种方法可以在单独的用户和他自己的用户组下运行程序,并通过限制共享对象只能由该用户和组访问来保护它们。这就是我的问题的答案,还是说窗户上有陷阱

  • 如果我必须在同一个用户下运行所有程序,或者如果某些程序是以root用户身份运行的(总是有这样的程序,不是吗),有什么方法可以保护它们吗

  • 我首先为所有想要一起通信的实例设置一个默认的shm和semaphore“key”。但可能有不同的项目已经掌握了“关键”。有什么方法可以解决这样的问题吗?我正在考虑选择一个“键”范围(即,键将是1000-2000范围内的整数),如果程序无法获取默认值的键,它将尝试从该范围中获取其他键

  • 我找到了相关的问题,但它并没有说明我的问题2和3。除了这个问题,我找不到任何与shm和信号量冲突和保护相关的东西,似乎在编写程序时没有考虑太多

    我的情况是,我有一个程序,希望与同一程序的其他实例进行通信。同一程序运行多个“集合”实例,其中一个“集合”中的程序一起通信,而另一个“集合”中的程序一起通信。它们通过受信号量保护的共享内存进行通信。该程序在各种*nix平台和windows上运行。它们应该能够全天候运行几年,并且应该是可靠和安全的,这就是我担心冲突的原因。

    只有在所有使用共享内存的程序都在协作时,信号才会“保护”共享内存。也就是说,它允许想要玩得很好的程序不会损坏共享对象

    然而,这并不能保证恶意程序能够跳入并破坏共享结构。我不知道C++标准中的任何安全相关的特性,因此我建议求助于特定于OS的方法。
    这意味着您可能需要在Linux、Windows、Mac等平台上使用不同的代码(无论哪种平台是您的目标平台),甚至可能需要在不同的操作系统版本上使用不同的代码。

    如果您主要关心的是冲突,那么使用GUID作为名称如何?(在我们的一生中)没有人会偶然想到这个
    {897917A3-D44E-4f0d-A458-1318152CCCDA}

    至于防范恶意软件,我会利用操作系统中的安全机制。要求服务在某个用户的范围内运行,然后将对外部对象(如信号量和共享内存)的访问限制为仅限该用户。只要该用户的安全没有被破坏,那么您的系统就应该是安全的

    在Windows上,当您在Unix上创建信号量和文件映射以及模式(使用
    create
    /
    open
    /
    chmod
    /etc)时,通常会使用
    SECURITY\u属性
    结构


    不要采用模糊保密的方法,让名字“难以猜测”,并相信它们是秘密的。它只会有助于不干扰同一系统上的其他应用程序。它不会阻止恶意用户/代码,因为对象的名称可能不是秘密。

    是的,由于使用共享mem和信号量的函数调用不同,我已经为不同平台提供了操作系统特定的代码部分。问题是-保护内存/信号量不被其他程序意外访问的技巧是什么?在Windows上,您应该看看。此结构用于和(用于)感谢。不幸的是,我不能使用GUID字符串作为on*nix,因为一些限制,我不得不使用shmget()和semget(),它们接受key\t(int)作为参数。啊。。。我忘了Unix中的信号灯。从2000年左右开始,我就没有使用过Unix。为什么不让一个进程随机选择一个空闲信号量密钥,并将其存储在共享内存中呢。然后其他进程可以通过共享内存获取信号量句柄。当然,在读取信号量密钥时,您必须使用一些锁定机制来保护其他进程不受竞争条件的影响。