首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解sem_open()

理解sem_open()
EN

Stack Overflow用户
提问于 2021-10-20 12:22:30
回答 2查看 382关注 0票数 1

我使用的是命名信号量,下面是我的sem_proc.cpp进程代码:

代码语言:javascript
复制
# include <iostream>
# include <string.h>
# include <unistd.h>
# include <semaphore.h>
# include <fcntl.h>

using namespace std;

int main(){
  sem_t *sem;
  string sem_name = "/my_sem";
  int value = 1;

  sem = sem_open(sem_name.c_str(), O_CREAT, 0644, value);
  cout << "sem_addr : " << sem << endl;
  
  cout << "sem_wait_result: " << sem_wait(sem) << endl;
  cout << "Enterd into CS" << endl;
  sleep(5);   // sleep for 5 seconds
  cout << "Waked up and now going out of CS" << endl;
  sem_post(sem);
  
  sem_close(sem);
  return 0;
}

我编制的资料如下:

代码语言:javascript
复制
g++ sem_proc.cpp -lpthread

然后在两个不同的终端上运行代码如下:

代码语言:javascript
复制
./a.out

第一终点站的产出是:

代码语言:javascript
复制
sem_addr : 0x7fef162de000
sem_wait_result: 0
Enterd into CS
Waked up and now going out of CS

第二航站楼的产出如下:

代码语言:javascript
复制
sem_addr : 0x7f53836a2000
sem_wait_result: 0
Enterd into CS
Waked up and now going out of CS

两个终端中名为“”的命名信号量的/my_sem地址不应该与将O_CREAT传递给sem_open()时相同,还是遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2021-10-23 19:04:20

不要期望信号量在不同进程中具有相同的内存地址。这不是信号量本身,sem_t是程序与信号量接口所需的数据副本。信号量本身由操作系统处理。

地址随机化、malloc、mmap等因素使精确定位变得复杂。

票数 0
EN

Stack Overflow用户

发布于 2021-10-24 01:34:00

POSIX中的sem_t是一个保存有关信号量的信息的结构,它通常通过调用带有标志MAP_SHAREDmmap来告诉内核使用预先分配的共享内存区域来创建。信号量(在Unix系统中)实际上只是文件描述符,因此将它们映射到内存需要在线程之间共享。

此映射的内存地址由内核根据其他映射的文件和区域来决定,这解释了每次映射的原因。内核将地址布局随机化,以防止缓冲区溢出造成的攻击。

有关更多信息,请阅读mmap系统调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69645917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档