`

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

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

相关推荐

    linux 系统编程 网络编程 源码

    semget_1.c semget.c ./tcp: fork qq simple ./tcp/fork: client client.c server server.c tcp.h ./tcp/qq: client client.c gen_single_nohead_pre.h server.c client1.cv gen_single_nohead_pre.c server tcp....

    Linux C库函数 txt格式

    Linux C库函数 txt格式 还要chm htm格式,请搜索 例子: abs(计算整型数的绝对值) 相关函数 labs, fabs 表头文件 #include 定义函数 int abs (int j) 函数说明 abs()用来计算参数j的绝对值,然后将结果返回...

    linux哲学家就餐3种方法代码实现

    文档里有三种方法实现哲学家就餐的源代码及注释、实验报告、代码如何编译运行及运行结果的截图。

    Linux高性能服务器编程

    13.5.1 信号量原语 13.5.2 semget系统调用 13.5.3 semop系统调用 13.5.4 semctl系统调用 13.5.5 特殊键值IPC_PRIVATE 13.6 共享内存 13.6.1 shmget系统调用 13.6.2 shmat和shmdt系统调用 13.6.3 shmctl系统...

    进程同步编程实例

    C语言编写的进程同步编程实例。可以参考使用semget semctl semop等函数。

    生产者消费者

    //生产者-消费者程序 //file producer-consumer.c //在程序中,父进程建立许多子进程,父进程增加信号量的数值... sem_Set_id=semget(IPC_PRIVATE,1,0600); if(sem_set_id==-1){ perror("main:semget"); exit(1);

    利用信号量实现进程间同步

    压缩包内含4个文件:a....semaphore.h和semaphore.c主要实现了sem_init,sem_p,sem_v,sem_del这四个函数(函数体内是转调semget,semctl,semop,这三个函数都是linux提供的库函数)。以一个.txt文件来模拟临界资源。

    论文研究-基于奖励机制和互斥条件的图像对象协同定位.pdf

    随着网络共享图像数据的日益丰富,同类对象检索和定位的需求变得更为迫切,为了更好地运用协同的思想定位同类对象,提出了一种基于奖励机制和互斥条件的对象协同定位方法。该方法采用对象性检测算法的输出结果作为...

    互斥与同步

    本章介绍操作系统的核心概念——进程。介绍进程的描述;进程的状态及其转换;进程的控制。同时还介绍了线程的概念。

    Linux System V信号量(互斥操作)

    System V信号量与System V其他两种通信机制(消息队列、共享内存)不同,其用来实现同步、互斥进程动作,通过semget函数创建一个信号集或打开一个信号量集,信号集又包括多个信号量,信号量的值要大于等于0,小于0,...

    互斥运行-避免重载[2]

    有的时候需要避免本程序重复运行,本示例代码可以实现。 VB.NET 源代码。

    进程的管道通讯机制和信号量同步互斥机制。

    使用信号量机制解决哲学家进餐问题。当哲学家进餐时,屏幕输出: [进程号] eating! 当哲学家思考时,屏幕输出: [进程号] thinging! 相关的系统调用和函数:pipe(); write(); read(); semget(); sepop(); semctl(); ...

    Embedfire-imx6#embed_linux_tutorial_ppt#system-V 信号量1

    system-V 信号量本质计数器作用保护共享资源互斥同步信号量用法构造一个信号量(semget)初始化信号量(semctl SETVA)对信号量进行P/V操作

    perl函数手册(英文版)

    处理器间通讯:msgctl, msgget, msgrcv, msgsnd, pipe, semctl, semget, semop, shmctl, shmget, hmread, shmwrite 数学:abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand 消息队列:msgctl, ...

    UnixProgramming

    这是我学习Unix(主要是linux)系统编程与网络编程的笔记,附上部分源码 系统编程 进程 创建fork 执行exec 销毁wait/waitpid(SIGCHLD) 进程间通信: 匿名管道pipe,命名管道(FIFO)mkfifo System V IPC(还有一组POSIX...

    进程间通信

    int semget(key_t key, int num_sems, int sem_flags); int semop(int semid, struct sembuf *sops, unsigned nsops); semget函数创建一个新的信号量或是获得一个已存在的信号量键值。 semop函数用来改变信号量...

    一个简单的线程同步实例

    代码中对线程的几种同步的方法进行了举例.

    UNIX网络编程 卷2:进程间通信

     11.2 semget函数 227  11.3 semop函数 229  11.4 semctl函数 231  11.5 简单的程序 232  11.6 文件上锁 237  11.7 信号量限制 238  11.8 小结 242  习题 242  第四部分 共享内存区  第12章 共享内存区...

    puge-up#programming-cpp#IPC入门1

    学习IPC的模型分析其使用的API汇总x|消息队列|信号量|共享内存头文件|||创建/打开IPC的函数|msgget()|semget()|shmget()控制

Global site tag (gtag.js) - Google Analytics