ipcs 的“文件”在哪里以及為什麼命名管道 (mkfifo) 未在 ipcs 中列出
我正在研究 linux 共享記憶體並偶然發現了這個
ipcs
命令。從手冊頁:
ipcs - provide information on ipc facilities
ipc
手冊頁中沒有解釋,但它很可能代表程序間通信。從它列出的資訊的上下文來看,這也是有意義的:共享記憶體段、消息隊列和信號量數組。我想知道,由於 linux/unix 中的所有內容都是一個“文件”,或者至少是一個類似文件的對象,那麼列出的元素中的“文件”在
ipcs
哪裡?為什麼創建的命名管道
mkfifo
未在 中列出ipcs
?據我了解fifos是隊列。創建的命名管道與創建mkfifo
的消息隊列有何不同ipcmk
?
ipcs
讓您看到稱為“System V IPC”的程序間通信方法。System V IPC 目前被廣泛忽視,而在過去則明顯不受歡迎。顯然在早期,不同的小組會實現他們需要的東西,有人需要消息隊列、共享記憶體和信號量。.這些 IPC 方法被廣泛批評為不是非常 Unixy,因為不是“文件”,這與您提出的問題相同。
我沒有解釋為什麼沒有集成命名管道和消息隊列,但我敢打賭它起源於相同的方式:一組想要命名管道,所以他們就去做了。
這裡有幾個問題:
- ipcs 中列出的元素的文件在哪裡?
這取決於。隊列在虛擬文件系統中是可見的。從 mq_overview(7) :
Mounting the message queue file system On Linux, message queues are created in a virtual file system. (Other implementations may also provide such a feature, but the details are likely to differ.) This file system can be mounted (by the superuser) using the following commands: # mkdir /dev/mqueue # mount -t mqueue none /dev/mqueue
共享記憶體 (shm_overview(7))
Accessing shared memory objects via the file system On Linux, shared memory objects are created in a (tmpfs) virtual file system, normally mounted under /dev/shm. Since kernel 2.6.19, Linux supports the use of access control lists (ACLs) to control the permissions of objects in the virtual file sys- tem.
信號量 (sem_overview(7))
Accessing named semaphores via the file system On Linux, named semaphores are created in a virtual file system, normally mounted under /dev/shm, with names of the form sem.somename. (This is the reason that semaphore names are limited to NAME_MAX-4 rather than NAME_MAX characters.) Since Linux 2.6.19, ACLs can be placed on files under this directory, to control object permissions on a per-user and per- group basis.
- 為什麼創建的命名管道
mkfifo
未在中列出ipcs
?我不確定,所以我只會給你我的意見,而不是回答。我的假設是,由於它們存在於實際的文件系統中,就像套接字一樣,它們的管理方式與核心管理共享記憶體段和消息隊列的方式不同。
- mkfifo 創建的命名管道與 ipcmk 創建的消息隊列有何不同?
管道和消息隊列的主要區別在於管道只是兩個程序之間的通信通道。它在字節級別起作用。你可以按照你想要的方式讀寫,你必須設計通信協議。它們是嚴格的 FIFO:在另一個字節之前寫入的字節總是在另一端之前讀取。消息隊列處理消息,而不是字節。通常,它們不是嚴格的 FIFO。這取決於實現,但它們可以支持消息之間的優先級機制。
在某種程度上,消息隊列提供了更多功能,但如果您願意,您可以使用消息隊列實現 FIFO,反之亦然。