【问题标题】:How to use semctl to set value of nth semaphore in the semaphore set如何使用 semctl 设置信号量集中第 n 个信号量的值
【发布时间】:2016-08-25 06:05:13
【问题描述】:

我使用semget 创建了一个System V 信号量

#define SEM_ID 250
...
sem_set_id = semget(SEM_ID, 1, IPC_CREAT | 0660);
if (sem_set_id == -1) {
perror("main: semget");
exit(1);

现在根据我的理解,这会创建一个信号量集,其中包含许多信号量。 但是如何识别特定的信号量以使用semctl设置其值...

int iter=0;
for(iter=0;iter<no_of_jobs;iter++)
{
    int rc=semctl(semid,iter,SETVAL, sem_val);
    if(rc==-1)
        {printf("Error:semctl\n");
        exit(1);
        }
}

以上代码为iter=0 运行,但在其他代码中失败。在struct semun sem_val 我已经设置了值sem_val.val=1;

【问题讨论】:

    标签: c semaphore


    【解决方案1】:

    semget() 的第二个参数是信号量集中的信号量数量。你指定了1,所以你有一个信号量。访问一个信号量以外的任何东西都会导致错误。

    例如,将1 更改为10,您应该可以迭代信号量0..9(含)。

    【讨论】:

    • 好的;它给出了什么错误?也许您的系统未配置为允许更大的信号量集。从 2 开始,看看能走多远。内核的配置方式因系统而异。什么和如何的细节非常非常多变。至少,您需要说明您正在使用哪个操作系统(例如,Solaris、Mac OS X 和 Linux 的答案大不相同)。
    • 在 Mac OS X 上,一些相关参数是:kern.sysv.semume=10kern.sysv.semmsl=87381kern.sysv.semmnu=87381kern.sysv.semmns=87381kern.sysv.semmni=87381 — 调整它们的命令是 sysctl .
    • 似乎key有问题....我更改了semget的第一个参数值并且它成功运行,是不是当我第一次执行程序时创建了信号量并且它程序退出时不会被破坏..??如何检查系统中现有的信号量并将其删除?
    • ipcsipcrm 是命令(IPC 状态和 IPC 删除)。以编程方式执行此操作:查看 semget() 等人的选项 - 和 semctl()。省略IPC_CREAT 将尝试使用现有的信号量集——如果失败,请使用IPC_CREAT 重试,但如果成功,则使用semctl() 将其删除,然后再使用IPC_CREAT 重试。如果信号量集合已经存在,那么集合的大小当然不会改变。信号量集独立于创建它的进程,因此在进程退出后信号量集继续存在,除非您使用 IPC_PRIVATE。
    • 非常感谢... :) @Jonathan Leffler
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2017-08-24
    • 2013-07-23
    相关资源
    最近更新 更多