Linux系统“semget failed for setnum: 0” 报错解决方案 分享

本文介绍如何在FreeBSD和Linux系统中使用ipcs和ipcrm命令来管理和清除共享内存(shm)及信号量(sem)。提供了具体步骤和示例,帮助解决因未释放资源导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

: 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
    当然,也可以把上面的操作写成脚本执行,不过写脚本时需要测试脚本是否真的执行该语句了,因为我曾经写了个脚本
程序,发现不能执行。
现在还没有找到原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值