两个不同的进程可以使用 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 平台上原生存在的 CreateEvent
、WaitForSingleObject
系列 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 消息,都是更好的选择。
我正在开发两个使用文件进行通信的应用程序。这些应用程序 运行 在同一台机器上。明确地说,我有一个 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 平台上原生存在的 CreateEvent
、WaitForSingleObject
系列 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 消息,都是更好的选择。