2011-06-05 130 views
2

我有一个关于操作系统中的进程间通信的问题。IPC通过写入文件?

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

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

假设进程以某种预先约定的协议/格式写入文件,所以两者在知道其他进程写入的位置以及何时等方面都没有问题。这种假设仅仅是为了理解。但在现实世界中,这可能过于严格,无法保持真实等。

如果否,那么这种情况有什么问题?是否如果两个不同的进程打开同一个文件,那么第一个进程所做的更改不会刷新到永久存储中供其他人查看,直到进程终止?或者是其他东西?

来自Windows和Linux的任何现实世界的例子也应该是有用的。

谢谢,

回答

2

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

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

磁盘存储用于进程间通信的一种真实情况是集群中使用的quorom磁盘。它是一种常见的磁盘资源,可由所有群集节点在SAN上访问,用于存储群集的配置。

2

posix系统调用mmap将文件映射到虚拟内存。如果映射在两个进程之间共享,则在一个进程中写入该区域将影响其他进程。现在对您提出疑问,是的,读取或写入底层文件的进程并不总是会看到与映射它的进程相同的数据,因为文件的片段被复制到RAM中并定期刷新到磁盘。虽然我相信你可以强制与msync系统调用同步。请阅读mmap()。它有许多其他内存共享选项。