我正在尝试使用单个客户端编写一个非常简单的单进程服务器代码。这些是单独的程序,因为我试图消除工具之间的编译器兼容性问题。最终,我打算允许多线程,但这只是我试图解决这个问题的一个步骤。我有一些可以使用Windows事件的东西,但我正试图摆脱它,因为据我所知,在Linux上没有直接的等价物。
服务器应该在客户端要求时执行代码。两个进程之间的I / O是通过共享内存。现在,我有初始化,执行和终止事件。在服务器收到事件后,它会将完成事件发送回客户端,通知它继续执行下一个任务。毫无疑问,这将扩展到一台机器之外。
我觉得互联网可能是最好的方法,但我相信,我正在制造赛车问题,因为我无法让服务器摆脱困境并等待客户端。我有服务器创建互斥锁但我希望它释放它并等待客户端使用它然后再回到服务器做某事。相反,服务器只是不断获取互斥量,虽然我可以理解为什么,但我无法找到任何解决方案。
我认为以下测试代码突出了这个问题。
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
int _tmain(int argc, char *argv[])
{
int i = 1;
// Create mutex
HANDLE hMutex = CreateMutex(NULL, FALSE, TEXT("TESTMUTEX"));
DWORD hResult;
// Check valid hMutex
while (i > 0)
{
// Wait for mutex
// How do I make it wait for a connection here?
hResult = WaitForSingleObject(hMutex, 1000);
// Write note to screen
printf("Received mutex!\n");
// Wait for user to enter info
scanf("%d", &i);
// Release mutex
if (!ReleaseMutex(hMutex))
{
printf("Mutex error!\n");
}
printf("Mutex Released!\n");
}
CloseHandle(hMutex);
return 1;
}
这只是一个无限循环。 scanf只是作为一个替身,让我暂停并退出测试代码。如何在创建互斥锁之间等待它在循环中等待它的位置?我想我需要一些方法来说实际上有一个客户端,并且在没有客户端连接之前不等待互斥锁(这将允许客户端首先抓住它)。这可能是显而易见的,但我对IPC很新。也许我需要包括套接字或管道?
我没有跳过一些虚拟代码之外的客户端代码,但是,由于服务器不正确,并且在没有客户端的情况下显示了足够的问题(我认为)。
示例用例将涉及Simulink S-Functions。我将在幕后拥有一个工程代码(服务器),其中有多个S-Functions(客户端)从单个Simulink模型运行。测试代码中的scanf代替服务器读取输入的位置,执行代码并写回输出。这个I / O位于共享内存中,因此我无法在不锁定资源的情况下编写和读取所有进程。
我认为它与此类似:Cross-Platform equivalent to windows events。不同之处在于我有两个完全独立的程序而不仅仅是一个程序。