ipcs 查詢程序間通訊狀態

2021-07-11 17:16:24 字數 4354 閱讀 2530

ipcs是linux下顯示程序間通訊設施狀態的工具。可以顯示訊息佇列、共享記憶體和訊號量的資訊。對於程式設計師非常有用,普通的系統管理員一般用不到此指令。

$ipcs

------ shared memory segments --------

key shmid owner perms bytes nattch status

------ semaphore arrays --------

key semid owner perms nsems

0x00000000 229376 weber 600 1

------ message queues --------

key msqid owner perms used-bytes messages

分別查詢ipc資源:

$ipcs -m 檢視系統使用的ipc共享記憶體資源

$ipcs -q 檢視系統使用的ipc佇列資源

$ipcs -s 檢視系統使用的ipc訊號量資源

示例:有個ipckey(51036),需要查詢其是否被占用;

首先通過計算器將其轉為十六進製制:

51036 -> c75c

如果知道是被共享記憶體占用:

$ipcs -m | grep c75c

0x0000c75c 40403197 tdea3 666 536870912 2

如果不確定,則直接查詢:

$ipcs | grep c75c

0x0000c75c 40403197 tdea3 666 536870912 2

0x0000c75c 5079070 tdea3 666 4

ipcs -l

------ shared memory limits --------

max number of segments = 4096

max seg size (kbytes) = 4194303

max total shared memory (kbytes) = 1073741824

min seg size (bytes) = 1

------ semaphore limits --------

max number of arrays = 128

max semaphores per array = 250

max semaphores system wide = 32000

max ops per semop call = 32

semaphore max value = 32767

------ messages: limits --------

max queues system wide = 2048

max size of message (bytes) = 524288

default max size of queue (bytes) = 5242880

以上輸出顯示,目前這個系統的允許的最大記憶體為1073741824kb;最大可使用128個訊號量,每個訊息的最大長度為524288bytes;

以linux系統為例,在root使用者下修改/etc/sysctl.conf 檔案,儲存後使用sysctl -p生效:

$cat /etc/sysctl.conf

# 乙個訊息的最大長度

kernel.msgmax = 524288

# 乙個訊息佇列上的最大位元組數

# 524288*10

kernel.msgmnb = 5242880

#最大訊息佇列的個數

kernel.msgmni=2048

#乙個共享記憶體區的最大位元組數

kernel.shmmax = 17179869184

#系統範圍內最大共享記憶體標識數

kernel.shmmni=4096

#每個訊號燈集的最大訊號燈數 系統範圍內最大訊號燈數 每個訊號燈支援的最大運算元 系統範圍內最大訊號燈集數

#此引數為系統預設,可以不用修改

#kernel.sem = *kernel.sem = 250 32000 32 128

顯示輸入不帶標誌的 ipcs:的輸出:

$ipcs

ipc status from /dev/mem as of mon aug 14 15:03:46 1989

t id key mode owner group

message queues:

q 0 0x00010381 -rrw-rw-rw- root system

q 65537 0x00010307 -rrw-rw-rw- root system

q 65538 0x00010311 -rrw-rw-rw- root system

q 65539 0x0001032f -rrw-rw-rw- root system

q 65540 0x0001031b -rrw-rw-rw- root system

q 65541 0x00010339--rw-rw-rw- root system

q 6 0x0002fe03 -rrw-rw-rw- root system

shared memory:

m 65537 0x00000000 dcrw------- root system

m 720898 0x00010300 -crw-rw-rw- root system

m 65539 0x00000000 dcrw------- root system

semaphores:

s 131072 0x4d02086a --ra-ra---- root system

s 65537 0x00000000 --ra------- root system

s 1310722 0x000133d0 --ra------- 7003 30720

ipcrm用法:

ipcrm -m shmkey  移除用shmkey建立的共享記憶體段

ipcrm -m shmid 移除用shmid標識的共享記憶體段

ipcrm -q msgkey 移除用msqkey建立的訊息佇列

ipcrm -q msqid 移除用msqid標識的訊息佇列

ipcrm -s semkey 移除用semkey建立的訊號

ipcrm -s semid 移除用semid標識的訊號

清除當前使用者建立的所有的ipc資源:

ipcs -q | awk '' | sh > /dev/null 2>&1;

ipcs -m | awk '' | sh > /dev/null 2>&1;

ipcs -s | awk '' | sh > /dev/null 2>&1;

查詢佇列queue:

$ipcs -q

------ message queues --------

key msqid owner perms used-bytes messages

0x49060005 58261504 user1 660 0 0

0x4f060005 58294273 user1 660 0 0

...

找出第6列大於0的服務:

$ ipcs -q |grep user1 |awk ''

0x00000000 1071579324 user1 644 1954530 4826

0x00000000 1071644862 user1 644 1961820 4844

0x00000000 1071677631 user1 644 1944810 4802

0x00000000 1071710400 user1 644 1961820 4844

ipcs 報告程序間通訊設施的狀態

程序間通訊有如下的目的 1 資料傳輸,乙個程序需要將它的資料傳送給另乙個程序,傳送的資料量在乙個位元組到幾m之間 2 共享資料,多個程序想要操作共享資料,乙個程序對資料的修改,其他程序應該立刻看到 3 通知事件,乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某件事情 4 資源共享,多個程序之...

VC 查詢程序,關閉程序

findprocess 這個函式唯一的引數是你指定的程序名,如 你的目標程序 是 notepad.exe 返回值是該程序的id,失敗返回0 dword findprocess char strprocessname tprintf t n return 0 function errorforce 此...

VC 查詢程序,關閉程序

findprocess 這個函式唯一的引數是你指定的程序名,如 你的目標程序 是 notepad.exe 返回值是該程序的id,失敗返回0 cpp view plain copy dword findprocess char strprocessname tprintf t n return 0 f...