1

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

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

2 回答 2

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;
}
于 2013-03-22T17:19:41.597 回答
1

这将是对Roman Nikitchenko答案的评论,除了 POSIX 标准的引用太长而无法放入单个评论中。

请注意 POSIX 关于路径的说明sem_open()

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

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

于 2013-03-22T18:13:10.460 回答