: config.h #define BRDSHM_KEY 2997 /* 0x00000bb5 */ /* 看板 */ #define UTMPSHM_KEY 1998 /* 0x000007ce */ /* 使用者 */ #define FILMSHM_KEY 2999 /* 0x00000bb7 */ /* 動態看板 */ #define STOCKSHM_KEY 4999 /* 0x00001387 */ /* 股市 */ #define PIPSHM_KEY 4998 /* 0x00001386 */ /* 電子雞對戰 */ #define BSEM_KEY 2000 /* 0x000007d0 */ /* semaphore key */ 如果要清除 shm|sem 的話,可配合 ipcs 使用 ipcrm 清掉 BRDSHM,要再度執行 ~/bin/account 來重新載入 清掉 FILMSHM,要再度執行 ~/bin/camera 來重新載入 > ------------------------------------------------------- < : 以下是 FreeBSD 的使用範例 % ipcs Shared Memory: T ID KEY MODE OWNER GROUP m 65536 1998 --rw------- bbs bbs m 65537 2997 --rw------- bbs bbs m 65538 2999 --rw------- bbs bbs m 65539 4997 --rw------- bbs bbs m 65540 4999 --rw------- bbs bbs m 65541 4998 --rw------- bbs bbs Semaphores: T ID KEY MODE OWNER GROUP s 65536 2000 --rw------- bbs bbs % ipcrm -M 2997 // 若要清掉 看板 shm % ipcrm -M 1998 // 若要清掉 使用者 shm % ipcrm -M 2999 // 若要清掉 動態看板 shm % ipcrm -M 4999 // 若要清掉 股市 shm % ipcrm -M 4998 // 若要清掉 電子雞 shm % ipcrm -M 2000 // 若要清掉 semphores 因為 KEY 固定都是 1998 2997 2999 4997 4998 4999 所以在 FreeBSD 下,其實不需要 ipcs,可以直接 ipcrm -M key > ------------------------------------------------------- < : 以下是 Linux 的使用範例 % ipcs ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000bb7 131076 bbs 600 111312 4 0x00000bb5 163845 bbs 600 44808 4 0x000007ce 196614 bbs 600 297240 5 0x00001387 491531 bbs 600 9620 0 0x00001386 434272 bbs 600 1090 0 ------ Semaphore Arrays -------- key semid owner perms nsems status 0x000007d0 229383 bbs 600 1 其中 key 以 HEX 來表示,在本文一開始的註解即有 HEX 的對應 % ipcrm shm 163845 // 若要清掉 看板 shm % ipcrm shm 196614 // 若要清掉 使用者 shm % ipcrm shm 131076 // 若要清掉 動態看板 shm % ipcrm shm 491531 // 若要清掉 股市 shm % ipcrm shm 434272 // 若要清掉 電子雞 shm % ipcrm sem 229383 // 若要清掉 semphores 因為 shmid 不固定數字 所以在 Linux 下,需要配合 ipcs,來執行 ipcrm shm|sem id
这几天在Linux系统上作并行计算时,总遇到p4_error: semget failed for setnum: 0这样的报错信息,上网搜索得 知需要清除shared memory,于是用自己的账号登录每台机器,利用ipcs -a查看未释放shared memory的机器,然后利用清除命令释放,但是仍旧无济于事。今天尝试利用root用户登录,把所有用户未释放的shared memory都用下面的命令给释放了,发现居然问题解决了,看来只释放某个用户的shared memory还不可以,还需要释放所用用户的。
操作步骤如下: 1. 利用root用户逐个登录Linux系统; 2. 利用命令ipcs -a查看是哪个用户占用了shared memory资源; 3. 利用下面的命令清除: ipcs -m | awk '/^ *0x/ {print $2 }' | xargs -n 50 ipcrm shm ipcs -s | awk '/^ *0x/ {print $2 }' | xargs -n 50 ipcrm sem 当然,也可以把上面的操作写成脚本执行,不过写脚本时需要测试脚本是否真的执行该语句了,因为我曾经写了个脚本 程序,发现不能执行。 现在还没有找到原因。