C++ 用跨平台IPC机制替换Windows事件

C++ 用跨平台IPC机制替换Windows事件,c++,ipc,C++,Ipc,我正在尝试编写一个代码,它是一个非常简单的单进程服务器和一个客户端。这些是独立的程序,因为我试图消除工具之间的编译器兼容性问题。最终,我打算允许多线程,但这只是一个步骤太远,因为我试图得到这个窍门。我有一些可以使用Windows事件的东西,但我正试图摆脱它,因为据我所知,Linux上没有直接的等价物 当客户端要求时,服务器应该执行代码。两个进程之间的I/O是通过共享内存进行的。现在,我有初始化、执行和终止的事件。服务器接收到事件后,会将完成事件发送回客户端,通知客户端继续执行下一个任务。不期望这

我正在尝试编写一个代码,它是一个非常简单的单进程服务器和一个客户端。这些是独立的程序,因为我试图消除工具之间的编译器兼容性问题。最终,我打算允许多线程,但这只是一个步骤太远,因为我试图得到这个窍门。我有一些可以使用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;
}
#包括
#包括
#包括
#包括
int _tmain(int argc,char*argv[])
{
int i=1;
//创建互斥
HANDLE hMutex=CreateMutex(NULL,FALSE,TEXT(“TESTMUTEX”);
德沃德·赫雷苏特;
//检查有效的hMutex
而(i>0)
{
//等待互斥
//我怎样才能让它在这里等待连接?
hResult=WaitForSingleObject(hMutex,1000);
//将注释写入屏幕
printf(“接收到的互斥锁!\n”);
//等待用户输入信息
scanf(“%d”、&i);
//释放互斥
如果(!ReleaseMutex(hMutex))
{
printf(“互斥错误!\n”);
}
printf(“已释放互斥锁!\n”);
}
密柄(hMutex);
返回1;
}
这只是一个无限循环。scanf只是一个替身,允许我暂停并退出测试代码。我如何让它在创建互斥体和它在循环中等待它的位置之间等待?我想我需要某种方式来说明实际上有一个客户机在那里,而不是等到有一个客户机连接后才等待互斥(这将允许客户机首先获取互斥)。这可能是显而易见的,但我对IPC还是比较陌生的。也许我需要包括插座或管道

除了一些伪代码之外,我还没有深入到客户机代码中,因为服务器就是不正确的,在没有客户机的情况下(我想)已经显示了足够多的问题

示例用例将涉及Simulink S函数。我将有一个工程代码(服务器)在幕后,多个S功能(客户端)从一个Simulink模型运行。测试代码中的scanf位于服务器读取输入、执行代码和写回输出的位置。此I/O位于共享内存中,因此如果不锁定资源,我无法让所有进程都进行写入和读取


我认为它与此类似:。不同之处在于我有两个完全独立的程序,而不仅仅是一个。

有人问过类似的问题。我想你不需要这里的互斥。互斥锁用于保护资源。你马上释放它,这样就不会有任何阻塞。尝试查看CreateEvent:Daniel,我的事件版本运行良好。我正试图摆脱这一点。另外,当我在将来某个时候开始运行多个实例时,互斥锁可能会发挥作用。我现在只处理一个实例,但我打算一旦成功,就将其应用到多个实例中。这证明了这个想法。我仍然认为你应该远离互斥。它处理锁定线程和放弃的方式并不是为您希望如何使用它而设计的。如果你想要跨平台的东西,来根管子怎么样?处理双向通信,可以是阻塞或异步的,并且您可以传递任何您喜欢的数据。否则,消息队列将工作,但这是一种方式。你认为这是一个很好的起点吗?有人提出了类似的问题。我想你不需要这里的互斥。互斥锁用于保护资源。你马上释放它,这样就不会有任何阻塞。尝试查看CreateEvent:Daniel,我的事件版本运行良好。我正试图摆脱这一点。另外,当我在将来某个时候开始运行多个实例时,互斥锁可能会发挥作用。我现在只处理一个实例,但我打算一旦成功,就将其应用到多个实例中。这证明了这个想法。我仍然认为你应该远离互斥。它处理锁定线程和放弃的方式并不是为您希望如何使用它而设计的。如果你想要跨平台的东西,来根管子怎么样?处理双向通信,可以是阻塞或异步的,并且您可以传递任何您喜欢的数据。否则,消息队列将工作,但这是一种方式。你认为这是一个很好的起点吗?