2011-06-05 127 views
2

我有一個關於操作系統中的進程間通信的問題。IPC通過寫入文件?

兩個進程可以通過打開同一個文件(也就是說在兩個進程之前創建,所以兩個進程都有文件處理程序)進行通信,然後通過寫入該文件進行通信?

如果是,那麼這個方法是什麼?我聽說IPC的兩種主要方式是通過共享內存和消息傳遞。這些方法之一是哪一種? 原因是,我不確定它是否屬於共享內存,因爲這個文件沒有映射到任何這些進程的地址空間。而且,從我的理解,在共享內存中,共享內存區域是這兩個進程的地址空間的一部分。

假設進程以某種預先約定的協議/格式寫入文件,所以兩者在知道其他進程寫入的位置以及何時等方面都沒有問題。這種假設僅僅是爲了理解。但在現實世界中,這可能過於嚴格,無法保持真實等。

如果否,那麼這種情況有什麼問題?是否如果兩個不同的進程打開同一個文件,那麼第一個進程所做的更改不會刷新到永久存儲中供其他人查看,直到進程終止?或者是其他東西?

來自Windows和Linux的任何現實世界的例子也應該是有用的。

謝謝,

回答

2

使用文件是一種共享內存。而不是在RAM中分配公用內存緩衝區,而是使用公共文件。

要成功管理通信,需要在文件中爲不同範圍的某種鎖定機制。這可能是鎖定文件系統提供的範圍(至少在Windows上可用)或全局操作系統互斥鎖。

磁盤存儲用於進程間通信的一種真實情況是集羣中使用的quorom磁盤。它是一種常見的磁盤資源,可由所有羣集節點在SAN上訪問,用於存儲羣集的配置。

2

posix系統調用mmap將文件映射到虛擬內存。如果映射在兩個進程之間共享,則在一個進程中寫入該區域將影響其他進程。現在對您提出疑問,是的,讀取或寫入底層文件的進程並不總是會看到與映射它的進程相同的數據,因爲文件的片段被複制到RAM中並定期刷新到磁盤。雖然我相信你可以強制與msync系統調用同步。請閱讀mmap()。它有許多其他內存共享選項。