我有一个不同的进程数,应该在我已经定义的共享内存上写入。我尝试使用系统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)
它运作良好,但我真的不想睡觉!
答案 0 :(得分:0)
提供有关您的代码的更多信息。你有什么问题?一旦获得资源或不等待,您的流程是否会被卡住?
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为零,则
操作可以立即进行“。
我希望你有一些想法来解决问题。