【问题标题】:sem_open for the array POSIXsem_open 用于 POSIX 数组
【发布时间】:2013-03-22 16:37:59
【问题描述】:

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

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

【问题讨论】:

  • 我认为您的问题会受益于使用 sem_init 而不是 sem_open。
  • 但另一个问题似乎是您对函数采用const char * 参数意味着什么感到困惑。

标签: c unix posix semaphore


【解决方案1】:

这里是关于如何获得唯一信号量名称的非常​​简短的说明。在实际系统中,可能有一些围绕信号量创建/删除的包装器,带有空闲 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;
}

【讨论】:

    【解决方案2】:

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

    注意 POSIX 关于sem_open() 路径的说法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多