sem_open用于数组POSIX

时间:2013-03-22 16:38:00

标签: c unix posix semaphore

我想打开n个信号量(n来自argv [])。 我做了sem_t *数组,我尝试在循环中sem_open它们。但是,我需要每个信号量的const char *唯一名称。 有什么办法吗?请帮助:)

sem_t *sem[n];
int i;
for(i=0; i<n; i++)
sem[i] = my_sem_open("XXXXXX",0);

2 个答案:

答案 0 :(得分:2)

以下是如何获取唯一信号量名称的简要说明。在实际系统中,可能存在一些包含信号量创建/删除的包装器,其中包含可用ID数组。每个操作都可以从此数组中获取ID(在sem_open()上)或释放其中一个(sem_close())。

#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>

#define N 10

int next_sema_id()
{
    static int seq_number = 0;
    return seq_number++;
}

int main()
{
    int n = N;

    sem_t *sem[n];
    int i;

    pid_t pid = getpid();

    for (i = 0; i < n; i++)
    {
        char buf[12];
        sprintf(buf, "sem%05d%03d", pid, next_sema_id());
        sem[i] = sem_open(buf,0);
    }

    for (i = 0; i < n; i++)
    {
        sem_close(sem[i]);
    }
    return 0;
}

答案 1 :(得分:0)

这是对Roman Nikitchenkoanswer的评论,但POSIX标准的引用太长而无法放入单个评论中。

请注意POSIX所说的sem_open()路径:

  

name参数指向一个命名信号量对象的字符串。未指定名称是否出现在文件系统中,并且对于将路径名作为参数的函数是可见的。 name参数符合路径名的构造规则,除了名称中除前导<slash>字符之外的<slash>字符的解释是实现定义的,并且name参数的长度限制是实现定义,不必与路径名限制{PATH_MAX}和{NAME_MAX}相同。如果name以<slash>字符开头,则调用具有相同name值的sem_open()的进程应引用相同的信号量对象,只要该名称尚未删除即可。如果name不以<slash>字符开头,则效果是实现定义的。

我认为这表示便携式信号量名称的格式为/some-unique-name-without-slashes,其中最大长度没有明确定义。其他名称(没有前导斜杠或带有额外斜杠)可能会也可能不起作用 - 您需要阅读您正在使用的实现的手册(实现必须定义允许的内容)。