You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sem_open创建命名信号量时不同进程返回地址不一致疑问

问题原因说明

  • 你的代码和操作完全没有问题,两个进程确实打开了同一个/my_sem命名信号量,返回地址不同是正常现象,不属于错误。
  • sem_open返回的是当前进程虚拟地址空间内的地址,不是系统全局的物理地址。Linux 下每个进程都有独立的虚拟地址空间,不同进程的虚拟地址本身没有全局可比性。
  • 命名信号量是内核维护的全局对象,sem_open的作用是把内核中这个全局的信号量对象,映射到调用进程的虚拟地址空间中供用户态操作。每个进程的虚拟地址空间布局、空闲区域位置都不一样,所以映射后的虚拟地址自然不同。这个逻辑和你打开同一个磁盘文件、两个进程拿到的文件描述符可能不同,或者用mmap映射同一个文件返回的虚拟地址不同是完全一致的。
  • 你调用sem_wait、sem_post等接口操作这个地址的时候,库函数和内核会自动完成虚拟地址到内核全局信号量对象的映射,所以哪怕两个进程用的虚拟地址不一样,实际操作的都是同一个内核信号量,同步功能完全不受影响。

如果你同时启动两个进程(间隔小于5秒),会看到第二个进程的sem_wait调用会阻塞,直到第一个进程执行完sem_post之后才会返回并打印Enterd into CS,这就已经证明两个进程操作的是同一个信号量,和返回的地址无关。你测试时两个进程都直接进入临界区,大概率是你启动第二个进程的时间比第一个晚了5秒以上,第一个已经执行完释放了信号量。

内容的提问来源于stack exchange,提问作者dragon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:36:04