我如何知道消息已经到达c中的共享内存中

我如何知道消息已经到达c中的共享内存中,c,shared-memory,C,Shared Memory,我有两个进程A和B。它们之间的通信是通过共享内存进行的 A ---> write->sharedmemory-----> Read-->B. B如何知道A已将某些内容写入共享内存。A写入共享内存,然后A向B发送信号,B捕获该信号并从内存中读取 A ---> write->sharedmemory-----> Read-->B. B通常不知道,A需要告诉他 可以使用带有轮询的管道、带有钩子的系统信号,或者可以在内存准备就绪时按需执行B,还可以执行

我有两个进程A和B。它们之间的通信是通过共享内存进行的

A ---> write->sharedmemory-----> Read-->B.

B如何知道A已将某些内容写入共享内存。

A写入共享内存,然后A向B发送信号,B捕获该信号并从内存中读取

A ---> write->sharedmemory-----> Read-->B.
B通常不知道,A需要告诉他

可以使用带有轮询的管道、带有钩子的系统信号,或者可以在内存准备就绪时按需执行B,还可以执行许多选项,因为根据定义,共享内存不涉及任何同步机制,所以您不知道何时更改了

而同步就像是特定于共享内存的操作系统

在Linux上,概述了Posix共享内存设施,并正确地提到了Posix信号量,它是一种同步机制。您还可以查看Posix消息队列,请参阅

您还可以使用-s,可能还使用多路复用系统调用,如…,-s,如果所有进程都在同一个系统上,可能是套接字,特定于Linux,-s-但我不建议在这种情况下使用它们-,等等

你可能需要。提供和C++11具有。给

<>你也可以考虑使用包含。您将对互斥锁感兴趣,请参阅等。。。和条件变量见等


另外,请阅读以获得Linux上各种机制的概述。

这实际上取决于您使用的操作系统

您可以使用一个信号来通知进程B您已经在它们的共享内存中写入了一些内容

A ---> write->sharedmemory-----> Read-->B.
见信号h


其他方法是使用互斥、管道、套接字…

组织同步的方法有很多,但它们都是特定于系统的

您可以分配共享内存的一个字节用于通信信息。它最初是0。当A将所有信息写入共享内存的其余部分时,它可以向同步字节写入1。然后,它将等待(最好不是忙等待)同步字节变回0。同时,B正在等待(优选地不是忙等待)同步字节变为1。当它这样做时,它将从共享内存中复制消息,然后将同步字节设置回0,并返回到循环中,等待同步字节再次更改为1

当然,在两个进程场景中,A和B可以简单地在同步字节的检查之间以纳秒级或类似的短延迟循环;这比检查同步字节的无约束循环要好

“不忙等待”部分意味着您通常需要两个信号量或类似的东西,这样您就可以在等待时不必使CPU饱和,并且在数据可用时可以迅速唤醒。当存在消息时,一个信号量由编写器设置;另一个是在消息已被使用时由读取器设置的。信号量的一个优点是可以有多个读卡器或多个写卡器


您还可以使用一对管道,一个用于a向B写入,一个用于B向a写入。当共享内存中有消息时,a会将消息复制到共享内存中,并将一个字节写入到B的管道中,然后从B的管道中读取一个字节。同时,B会从a的管道中读取一个字节,从共享内存中复制消息,并将管道上的一个字节写入,以指示它已完成共享内存中的消息。但是,你可能会问自己——为什么不使用管道而不是共享内存呢。

标准C中没有共享内存。你需要指定你正在使用的操作系统、硬件等。你的需要不在简单的共享内存中,而是在消息队列中。
A ---> write->sharedmemory-----> Read-->B.