我有不同数量的进程,应该在已经定义的共享内存上写入。我正在尝试使用系统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)
它很好,但我真的我不想睡觉! 最佳答案
提供有关您的代码的更多信息。您遇到什么问题?一旦获得资源还是没有等待,您的流程是否会卡住?semop()
的手册页说:
1)如果sem_op
是less 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为零,则操作可以立即进行”。
希望您有解决问题的想法。
关于c - 通过信号量访问共享内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47657723/