两个不同的进程可以使用 WINAPI 中的 Windows 事件相互通信吗?

Can two different processes communicate with each other using Windows events in WINAPI?

我正在开发两个使用文件进行通信的应用程序。这些应用程序 运行 在同一台机器上。明确地说,我有一个 writer.exe 和一个 reader.exe 可执行文件。

writer.exe 不断地向普通文件"some_file.bin" 写入一个随机整数并关闭该文件。它再次重复相同的过程:打开文件,随机写入 int 并关闭它。这是在 while 循环中完成的。

reader.exe 不断读取文件 "some_file.bin",将读取的整数打印到其控制台。

这两个应用程序都是用 C++ 编写的,使用 std::fstream class 文件 I/O。

到目前为止,这还不能正常工作,因为这里发生了竞争条件。

我想要一些方法在这两个进程之间正确通信,使用 Win32 事件,以便 writer.exe 进程知道要等到 reader.exe 进程完成读取,并且 reader.exe 进程知道暂停,直到 writer.exe 进程完成写入。

我希望使用 Windows 平台上原生存在的 CreateEventWaitForSingleObject 系列 API 调用来完成此操作。

请随时告诉我这是否可能两个进程之间?

到目前为止,我只找到了使用上述 APIs 向一个主进程的线程发出信号的示例... ?

是的,可能。当一个进程创建一个事件对象的句柄时,您可以选择在内核中为该对象分配一个名称。然后另一个进程可以 create/open 它自己的使用相同名称的事件对象的句柄。

请注意,要完成您想要的,您实际上需要 2 个事件,例如:

writer.exe:

HANDLE hReadable = CreateEvent(NULL, FALSE, FALSE, TEXT("ReaderCanRead"));
if (!hReadable) ...

HANDLE hWritable = CreateEvent(NULL, FALSE, TRUE, TEXT("WriterCanWrite"));
if (!hWritable) ...

...

while (!quit)
{
    ...
    WaitForSingleObject(hWritable, INFINITE);
    if (quit) break;
    // write int...
    SetEvent(hReadable);
    ...
}

reader.exe:

HANDLE hReadable = CreateEvent(NULL, FALSE, FALSE, TEXT("ReaderCanRead"));
// or: HANDLE hReadable = OpenEvent(SYNCHRONIZE, FALSE, TEXT("ReaderCanRead"));
if (!hReadable) ...

HANDLE hWritable = CreateEvent(NULL, FALSE, TRUE, TEXT("WriterCanWrite"));
// or: HANDLE hWritable = OpenEvent(EVENT_MODIFY_STATE, FALSE, TEXT("WriterCanWrite"));
if (!hWritable) ...

...

while (!quit)
{
    ...
    WaitForSingleObject(hReadable, INFINITE);
    if (quit) break;
    // read int...
    SetEvent(hWritable);
    ...
}

也就是说,您可以考虑通过 CreateFileMapping()+MapViewOfFile() 使用命名的共享内存块,而不是使用物理文件。

但是,与使用受事件保护的共享 file/memory 相比,还有许多其他进程间通信机制更适合您的 producer/consumer 模型。管道、套接字、邮槽,甚至 window 消息,都是更好的选择。