我想打开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);
答案 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 Nikitchenko的answer的评论,但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
,其中最大长度没有明确定义。其他名称(没有前导斜杠或带有额外斜杠)可能会也可能不起作用 - 您需要阅读您正在使用的实现的手册(实现必须定义允许的内容)。