c++ - Mac OS X 等价于 CreateEvent() 与用于进程间通信的命名对象?

标签 c++ macos ipc

我正在寻找 Mac OS X 上最简单或最合适的方法来简单地“发出信号”或通知一个进程。来自 Windows 背景,这可以使用类似以下的方法来实现。

进程A:

// create named event
hCreatedEvent = CreateEvent(NULL, TRUE, FALSE, "MyUniqueNamedEvent");

// wait for it to be signalled
WaitForSingleObject(hCreatedEvent, INFINITE);

然后在进程B中:

// open the existing named event
hOpenedEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MyUniqueNamedEvent");

// signal it
SetEvent(hOpenedEvent);

因此,当执行进程 B 中的 SetEvent 调用时,进程 A 会从 WaitForSingleObject 中跳出并执行一些工作。

我实际上不需要发送任何数据,所以我排除了诸如命名管道 (FIFO) 或套接字之类的东西,因为它们有点矫枉过正(我看过 this similar question ,但因为它们需要发送数据,我的问题略有不同)。同样,我不知道其他进程的 PID(这就是为什么我需要某种共享对象)所以我不能使用任何需要它的东西。

到目前为止,我的入围名单是:

  • POSIX 信号量 - 使用 sem_opensem_waitsem_post 分别创建/打开、等待和发出事件信号。使用起来相当简单。
  • BSD notify(3) 函数 - 使用起来相当简单,如果使用通知不是有点笨拙的话。
  • NSDistributedNotificationCenterCFNotificationCenter 函数 - 看起来是最“Mac 风格”的处理方式,而且相当简单。但是,我的代码可能需要作为 dylib 运行并根据 this unanswered question ,这可能对我不起作用。

那么,有没有人有任何使用上述任何方法的建议/技巧/恐怖故事,或者我没有想到的更合适的替代方法来实现我想要的?

最佳答案

所以经过更多的挖掘,我最终决定沿着 POSIX 信号量路线走下去,这似乎对我有用,就像这样:

在进程 A 中(等待信号量):

// create semaphore, fail if already exists
sem_t *sem = sem_open("MyUniqueSemaphore", O_CREAT | O_EXCL, 0666, 0);
if (sem != SEM_FAILED)
{
    // wait on semaphore
    if (sem_wait(sem) == 0)
    {
        // semaphore signalled!
    }

    // close our "handle" to the semaphore and remove it from the system
    sem_close(sem);
    sem_unlink("MyUniqueSemaphore");
}

然后在进程 B 中(发出信号量信号):

// open the existing semaphore created in process A
sem_t *sem = sem_open("MyUniqueSemaphore", 0);
if (sem != SEM_FAILED)
{
    // "signal" it
    sem_post(sem);

    // close our "handle" to the semaphore
    sem_close(sem);
}

信号量似乎也是一种“自动重置”类型(用 Windows 的说法),因此一旦发出信号就会恢复为未发出信号。

关于c++ - Mac OS X 等价于 CreateEvent() 与用于进程间通信的命名对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8886666/

相关文章:

python - 在单独的进程中读取 USB 摄像头时,OpenCV 在 OS X 上崩溃

xcode - 对 Mac 应用安装程序签名的困惑

c# - 在 C# 进程之间共享对象的推荐方式

c - 信号量计数与 semop 调用期间传递的操作值之间的差异

c++ - fwrite 阻塞在 "<?xml version"

c++ - 从 C++ 代码创建单独的 QML 窗口

c++ - 在 GCC 中使用一个 C 函数编译 C++

macos - Cocoa 文件打开事件 - 检测文件是否被打开

angular - Electron IPC消息

c++ - 类构造函数上 boost::shared_ptr 的默认值