process - IPC 通过写入文件?

标签 process operating-system ipc shared-memory data-transfer

我有一个关于操作系统中进程间通信的问题。

两个进程是否可以通过打开同一个文件(据说是在两个进程之前创建的,所以两个进程都有文件处理程序)然后通过写入该文件进行通信来相互通信?

如果是,这个方法属于什么?我听说 IPC 的两种主要方式是共享内存和消息传递。这个方法属于哪一个? 原因是,我不确定它是否属于共享内存,因为这个文件没有映射到任何这些进程的地址空间。而且,根据我的理解,在共享内存中,共享内存区域是两个进程的地址空间的一部分。

假设进程以某种预先商定的协议(protocol)/格式写入文件,因此双方都知道其他进程写入的位置和时间等没有问题。这个假设只是为了理解。但在现实世界中,这可能过于严格而无法成立等等。

如果不是,这个场景有什么问题?是不是如果两个不同的进程打开同一个文件,那么在进程终止之前,第一个进程所做的更改不会刷新到持久存储中供其他人查看?还是别的?

任何来自 Windows 和 Linux 的真实示例也应该有用。

谢谢,

最佳答案

使用文件是一种共享内存。不是在 RAM 中分配一个公共(public)内存缓冲区,而是使用一个公共(public)文件。

为了成功地管理通信,需要对文件中的不同范围使用某种锁定机制。这可能是锁定文件系统提供的范围(至少在 Windows 上可用)或全局操作系统互斥锁。

磁盘存储用于进程间通信的一个真实场景是集群中使用的仲裁磁盘。它是一个公共(public)磁盘资源,所有集群节点都可以通过 SAN 访问它,用于存储集群的配置。

关于process - IPC 通过写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6241398/

相关文章:

ios - 是否可以获得PID的启动时间?

c# - 如何获取特定进程中存在的所有实例?

C IPC等待 child

c++ - IPC 通过 mmap 文件 : should atomics and/or volatile be used?

linux - 列出所有 POD

linux - 捕捉持续不到一秒的过程

c# - 不调用 Thread.Join() 的后果

linux - Unix 环境中的高级程序设计第 1 版

linux - 使用GDB读取寄存器指向的内存

matlab - 如何从命令行向 Erlang 进程发送消息?