我想打开 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);
这是关于如何获得唯一信号量名称的非常简短的说明。在实际系统中,可能有一些围绕信号量创建/删除的包装器,带有空闲 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;
}
这将是对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
,其中最大长度没有明确定义。其他名称(没有前导斜杠或带有额外斜杠)可能有效,也可能无效——您需要阅读您正在使用的实现的手册(实现必须定义允许的内容)。