Content-Description: [** BIG-5 charset **] [GNU/Linux] ipcs -- 檢視 shm 的?穈T

[GNU/Linux] ipcs -- 檢視 shm 的資訊

/ 前言 /

IPC -- Inter Proccess Channel,是在以 System V 系統上提供 個行程間溝通的方式之一。利用記憶體中 Shared Memory,Semaphore Array 和 Message Queue 來提供行程間通訊的管道。常見的例子 如一服務級行程所衍生的眾多子行程,可透過 IPC 的機制來互相 溝通。

ipcs -- 這是一隻在 Linux console 下的檢視 Shared Memory, Semaphore Array 和 Message Queue 的使用情況。當得知這些相 關資訊之後,管理者可以利用如 ipcrm 的程式來加以管理。ipcs 的作者是krishna balasubramanian(balasub@cis.ohio-state.edu) 。

/ 路徑 /

以筆者安裝的 RedHat Linux 7.0 為例,ipcs 是放置在 /usr/bin 下。

/ 所使用的 shared library /

在筆者所使用的 RedHat Linux 7.0 下,ipcs 所使用到的 shared library 有 libc.so, ld-linux.so。

/ 使用說明及範例 /

在 console 下直接下命令 ipcs 不加任何參數,會得到最基本資 訊的輸出:

[root]# ipcs

------ Shared Memory Segments
   
key shmid owner perms bytes nattch status
0x00000bb7 0 bbs 600 111312 25
0x000007ce 1 bbs 600 143240 26
0x00000bb5 2 bbs 600 40968 25
0x00000000 2051 bbs 600 46084 11 dest
0x00280267 4 root 644 1048576 0
------ Semaphore Arrays ----- -    
key semid owner perms nsems status
0x00280269 0 root 666 14  
------ Message Queues -------      
key msqid owner perms used-bytes messages

我們可以注意到的是,Shared Memory Segments, Semaphore Arrays, Message Queues 都有一個 perms 的欄位,其表示法同檔案權限 的表示法,如 600 表示只有 owner 可以讀寫,同群組人與其他 人則不能讀也不能寫;644 則表示 owner 可以讀寫,同群組人與 其他人則只能讀但不能寫。因此當我們以一般 user 執行 ipcs 所看到的輸出會與以 super user 執行的輸出不同:

[gjchen]$ ipcs

------ Shared Memory Segments
 
key shmid owner perms bytes nattch status
0x00280267 4 root 644 1048576 0
------ Semaphore Arrays ----- --  
key semid owner perms nsems status
0x00280269 0 root

------ Message Queues -------
666 14
key msqid owner perms used-bytes messages

如上所示,以其他帳號執行 ipcs 所看到的輸出只剩下 perms 為 644 和 666 的資訊了。

如果管理者只需要檢視 Shared Memory Segments, Semaphore Arrays 與 Message Queues 的資訊其中之一,則可與參數 -m -s -q 分開或合併使用。

-m:顯示 Shared Memory Segments 的資訊。 -s:顯示 Semaphore Arrays 的資訊。 -q:顯示 Message Queues 的資訊。

如以下是 ipcs -mq 的輸出結果:

[root]# ipcs -mq

------ Shared Memory Segments
   
key shmid owner perms bytes nattch status
0x00000bb7 0 bbs 600 111312 26
0x000007ce 1 bbs 600 143240 27
0x00000bb5 2 bbs 600 40968 26
0x00000000 2051 bbs 600 46084 11 dest
0x00280267 4 root

------ Message Queues -------
644 1048576 0
key msqid owner perms used-bytes messages

如上就只輸出 Shared Memory Segments 與 Message Queues 的 資訊。

而更詳細的 ipcs 輸出資訊,可以包括下面五項:

參數| 顯示資訊


-t | shm 的 Attache, Detache, Change 時間 (與 -m 合用)

| shm 的 last Operation, last Change 時間 (與 -s 合用) | Message Queues 的 Send, Recv, Change 時間 (與 -q 合用)

-p | shm 的 Creator 和 Last-op 的 PID (與 -m 合用)

| 使用 Message Queues 的 PIDs (與 -q 合用)


-c | shm 的 Creator 和 Owner (與 -m 合用)

| Semaphore Arrays 的 Creator 和 Owner (與 -s 合用) | Message Queues 的 Creator 和 Owner (與 -q 合用)


-l | Shared Memory 的最大與最小限制 (與 -m 合用)

| Semaphore 的最大與最小限制 (與 -s 合用) | Messages 的最大與最小限制 (與 -q 合用)


-u | Shared Memory(-m), Semaphore(-s), Messages(-q) 的狀態

例如想看看目前所有使用 Shared Memory 的片段分別是由誰所建立 和屬於誰的,可以使用 ipcs -m -c 來得到資訊:

[root]# ipcs -m -c


Shared Memory Segment Creators/Owners ---
shmid perms cuid cgid uid gid
0 600 bbs bbs bbs bbs
1 600 bbs bbs bbs bbs
2 600 bbs bbs bbs bbs
2051 600 root root bbs bbs
4 644 root root root root

在以上的幾個例子中,我們可以發現 Shared Memory Segment, Semaphore Array 和 Message Queues 分別有 shmid, semid 及 msqid 欄位記載著各個片段的 ID,而我們可以使用 -i ID 這個 參數來得到關於某項 Shared Memory Segment, Semaphore Array 和 Message Queues 更詳細的資訊。如想檢視 shmid 為 0 的 Shared Memory Segment 的詳細資訊,使用 ipcs -m -i 0 得到 輸出如下:

[root]# ipcs -m -i 0

Shared memory Segment shmid=0
uid=9999 gid=99 cuid=9999 cgid=99
mode=0600 access_perms=0600
bytes=111312 lpid=7274 cpid=675 nattch=24
att_time=Thu Oct 4 14:01:05 2001
det_time=Thu Oct 4 14:01:05 2001
change_time=Mon Sep 17 21:52:52 2001


如想檢視 semid 為 0 的 Semaphore Array 的詳細資訊,使用 ipcs -s -i 0 得到輸出如下:

[root]# ipcs -s -i 0

Semaphore Array semid=0    
uid=0 gid=0 cuid=0 cgid=0  
mode=0666, access_perms=0666  
nsems = 14      
otime = Thu Oct 4 13:50:17 2001  
ctime = Thu Oct 4 13:50:17 2001  
semnum value ncount zcount pid
0 1 0 0 6392
1 1 0 0 4256
2 1 0 0 4256
3 1 0 0 4256
4 1 0 0 4256
5 1 0 0 24161
6 1 0 0 24161
7 1 0 0 24161
8 1 0 0 24161
9 1 0 0 4256
10 1 0 0 4256
11 1 0 0 24161
12 1 0 0 4256
13 1 0 0 24161

而 -i ID 的參數只能同時與一個 -m, -s 或 -q 使用。

最後,ipcs -h 可以得到 ipcs 的基本使用資訊:

[root]# ipcs -h
ipcs provides information on ipc facilities for which you have read access. Resource Specification:

-m : shared_mem
-q : messages
-s : semaphores
-a : all (default)

Output Format:

-t : time
-p : pid
-c : creator
-l : limits
-u : summary

-i id [-s -q -m] : details on resource identified by id usage : ipcs -asmq -tclup

ipcs [-s -m -q] -i id
ipcs -h for help.

而更詳細的資訊可以 man ipcs 得到。

/ 勘誤資訊 /

本文如有謬誤或建議,請來信筆者的電子郵件信箱。

gjchen@csie.nctu.edu.tw 交大資工 陳俊哲