linux中的共享内存锁(c语言)
我在锁定共享内存方面有问题。这是代码:linux中的共享内存锁(c语言),c,linux,memory,operation,C,Linux,Memory,Operation,我在锁定共享内存方面有问题。这是代码: if(shmctl(id,SHM_LOCK,&sgmlock)==FAILED) exit_failed("shmctl failed"); printf("%d got the lock\n", getpid()) ; if(arr[CHLD3_ID_SET]==1){ arr[CHLD3_ID_SET]++; puts("2a"); } else if(arr[CHLD3_ID_SET]==2) { puts("2b");
if(shmctl(id,SHM_LOCK,&sgmlock)==FAILED)
exit_failed("shmctl failed");
printf("%d got the lock\n", getpid()) ;
if(arr[CHLD3_ID_SET]==1){
arr[CHLD3_ID_SET]++;
puts("2a");
}
else if(arr[CHLD3_ID_SET]==2)
{
puts("2b");
arr[CHLD3_ID]=EMPTY;
arr[CHLD3_ID_SET]=EMPTY;
}
printf("%d got unlocked\n", getpid()) ;
if(shmctl(id,SHM_UNLOCK,&sgmlock)==FAILED)
exit_failed("shmctl failed");
10938 got the lock
10939 got the lock
2a
10938 got unlocked
3
2b
10939 got unlocked
3
因此,第一种方法是如何增加arr[CHLD3_ID_SET]
第二次重置数组中的单元格
这两个进程是父进程的分支(并使用相同的共享内存)
如果程序不在本节堆栈中,则没有问题
这是代码的输出:
if(shmctl(id,SHM_LOCK,&sgmlock)==FAILED)
exit_failed("shmctl failed");
printf("%d got the lock\n", getpid()) ;
if(arr[CHLD3_ID_SET]==1){
arr[CHLD3_ID_SET]++;
puts("2a");
}
else if(arr[CHLD3_ID_SET]==2)
{
puts("2b");
arr[CHLD3_ID]=EMPTY;
arr[CHLD3_ID_SET]=EMPTY;
}
printf("%d got unlocked\n", getpid()) ;
if(shmctl(id,SHM_UNLOCK,&sgmlock)==FAILED)
exit_failed("shmctl failed");
10938 got the lock
10939 got the lock
2a
10938 got unlocked
3
2b
10939 got unlocked
3
(3是从锁定部分打印出来的。)
我们可以看到一个锁,第二个可以进入锁段。
我做错了什么
谢谢
SHM_LOCK
不是互斥工具。这只是对内核的一个请求,即共享内存段中的页面不能从内存中调出-类似于mlock()
如果您希望使用SYSV IPC API进行互斥(shmctl()
就是其中之一),那么您需要使用SYSV信号量(semctl()
/semget()
/semop()
)