通过信号量访问共享内存

时间:2017-12-05 15:57:29

标签: c process fork semaphore

我有一个不同的进程数,应该在我已经定义的共享内存上写入。我尝试使用系统V信号量。信号量(sem_access)初始化为1。

    sem_access.sem_op = -1;
    semop(sem_access_id, &sem_access, 1);

    info->index++;
    printf ("INDEX= %d\n", info->index);

    sem_access.sem_op = 1;
    semop(sem_access_id, &sem_access, 1);

问题是printf始终打印相同的数字,而不增加索引。 PS:抱歉我的英语不好,但我是西班牙语。 编辑:如果我插入一个sleep(1)它运作良好,但我真的不想睡觉!

1 个答案:

答案 0 :(得分:0)

提供有关您的代码的更多信息。你有什么问题?一旦获得资源或不等待,您的流程是否会被卡住?

semop()的手册页说:

1)如果sem_opless than zero,则该流程必须具有更改权限        semaphore set。所以如果sem_access.sem_op = -1;当其他进程将此值设为0或大于0时,只有此进程才会访问共享资源。

流程1 :  sem_access.sem_op = -1; //此过程将等到条件不成立

进程2 :因为在第一个进程中sem_op的值为-1,所以此进程需要将sem_op值设为0或1,然后才会执行其他进程,所以这样做

sem_access.sem_op = 1;

如semop()的手册页所示,如果sem_op是正整数,则操作会将this值添加到        信号量值(semval)。现在sem_op变为-1 + 1 = 0,再次引用semop()手册页“这是一个”wait-for-zero“操作:如果semval为零,则        操作可以立即进行“。

我希望你有一些想法来解决问题。