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()