Fifo

ipcs 的“文件”在哪里以及為什麼命名管道 (mkfifo) 未在 ipcs 中列出

  • May 13, 2013

我正在研究 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,反之亦然。

引用自:https://unix.stackexchange.com/questions/73260