我明白信号量,但是这些信号量数组在我的 Linux 机器上用来做什么呢?
$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 327681 root 644 80 2
0x00000000 360450 root 644 16384 2
0x00000000 393219 root 644 280 2
...
------ Semaphore Arrays --------
key semid owner perms nsems
0x4172d4f4 290914305 lazer 660 104
0x3b87b970 291045378 lazer 660 104
0xa97eb380 293928963 lazer 660 104
0x1fde2040 294191108 lazer 660 104
------ Message Queues --------
key msqid owner perms used-bytes messages
$
此外,操作系统资源他们在守卫吗?
答案1
ipcs -i <SEMID> -s
将为您提供有关特定 sem 阵列的更多信息。例如
[me@home]$ ipcs -i 32769 -s
Semaphore Array semid=32769
uid=537 gid=85 cuid=537 cgid=85
mode=0600, access_perms=0600
nsems = 1
otime = Mon Sep 19 12:18:53 2011
ctime = Mon Sep 19 12:07:11 2011
semnum value ncount zcount pid
0 1 0 0 7548
使用 pid 来查明谁在使用它。
答案2
是的,我对此感到困惑。
信号量数组是 SysV 为用户进程提供的内核信号量的替代品。
它们有点复杂:
它们使用一个值数组来通过一个信号量保护多个资源。因此,Linux 内核信号量具有“up”/“down”操作来增加/减少结构的值,而 sem_arrays 具有编辑其数组中任何值的操作。
它们具有可撤销的操作。如果进程意外终止,则可以允许内核回滚操作。
另外,他们守护着哪些操作系统资源?
因为它们用于用户模式进程,所以我认为它们不会保护任何操作系统资源。
更多信息:《理解Linux内核》-第19章