如何使用semget实现sem_open

时间:2017-08-30 04:21:28

标签: c linux semaphore

我想使用System V信号量实现一些POSIX信号量API,并发现此博客Implement POSIX Semaphore APIs using System V Semaphores APIs很有用。

我使用semget(系统V)来实现sem_open(POSIX)。如下:

sem_t *sem_open(const char *name, int oflag, ...) {
    creat(fname, 0444);
    key_t key = ftok(name, 1);
    semget(key, 1, IPC_CREAT)
}

但是semget会返回信号量集标识符,而sem_open会返回新的POSIX信号量。允许的信号量集的数量非常小,因此我无法创建许多信号量。我怎么能摆脱它。

1 个答案:

答案 0 :(得分:0)

我假设您正在询问如何增加系统限制。为此,您可以通过在Linux系统上运行以下命令来查找当前设置(或者也可以使用ipcs)

# cat /proc/sys/kernel/sem
250 32000   32  128

现在从手册页中我们看到以下输出中的四个值

  

SEMMSL

     
      
  • 每个semid的最大信号量数量:依赖于实现(在Linux上,可以通过第一个字段读取和修改此限制   of / proc / sys / kernel / sem)。
  •   
     

SEMMNS

     
      
  • 系统范围的最大信号量数量:取决于策略(在Linux上,可以通过第二个字段读取和修改此限制   的/ proc / SYS /内核/ SEM)。值大于SEMMSL * SEMMNI使其成为
      不相关的。
  •   
     

SEMOPM    - 每个semop可执行的最大信号量操作数(2)

     

SEMMNI

     
      
  • 系统范围内信号量集的最大数量:取决于策略(在Linux上,可以通过第四个字段读取和修改此限制)   的/ proc / SYS /内核/ SEM)。
  •   

现在,为了修改上述任何一个内核参数,您可以运行以下命令

# printf '250\t32000\t50\t150' >/proc/sys/kernel/sem