了解 posix 进程间信号量

2023-12-08

根据我的理解,信号量应该可以跨相关进程使用,而无需将其放置在共享内存中。如果是这样,为什么下面的代码会死锁?

#include <iostream>
#include <semaphore.h>
#include <sys/wait.h>

using namespace std;

static int MAX = 100;

int main(int argc, char* argv[]) {
  int retval;
  sem_t mutex;

  cout << sem_init(&mutex, 1, 0) << endl;

  pid_t pid = fork();

  if (0 == pid) {
    //     sem_wait(&mutex);
    cout << endl;
    for (int i = 0; i < MAX; i++) {
      cout << i << ",";
    }
    cout << endl;
    sem_post(&mutex);

  } else if(pid > 0) {
    sem_wait(&mutex);
    cout << endl;
    for (int i = 0; i < MAX; i++) {
      cout << i << ",";
    }
    cout << endl;
    //     sem_post(&mutex);
    wait(&retval);

  } else {
    cerr << "fork error" << endl;
    return 1;
  }

//   sem_destroy(&mutex);

  return 0;
}

当我在 Gentoo/Ubuntu Linux 上运行它时,父进程挂起。显然,它没有收到孩子的帖子。取消注释 sem_destroy 不会有任何好处。我错过了什么吗?

更新1:这段代码有效

mutex = (sem_t *) mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
if (!mutex) {
  perror("out of memory\n");
  exit(1);
}

谢谢, 尼勒什。


中的措辞手册页有点暧昧。

如果 pshared 非零,则信号量在进程之间共享, 和应该位于共享内存区域.

由于 fork(2) 创建的子进程继承其父进程的内存 映射,它还可以访问信号量。

对,但是它仍然必须位于共享区域。否则,内存就会被通常的复制CoW就是这样。

您至少可以通过两种方式解决这个问题:

  • Use sem_open("my_sem", ...)
  • Use shm_open and mmap创建共享区域
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 posix 进程间信号量 的相关文章

随机推荐

  • Jquery谷歌地图插件,添加事件监听器

    有人可以解释一下以下代码片段的含义吗 jQuery fn name 中发现谷歌 jquery ui map plugin jQuery each click mousedown rightclick dblclick mouseover m
  • 实现接口的非泛型方法中泛型的模式匹配

    我有一个令人沮丧的问题 我正在建造一个查看引擎在 ASP NET MVC 中 正在实现 IViewEngine 接口 在其中一种方法中 我试图动态地找出视图结果的类型 有时结果是一个模板 类型为 Template 这些键用于定位模板中的占位
  • 从int到short的可能有损转换[重复]

    这个问题在这里已经有答案了 我已将数组 gx 数组 arr 定义为短类型 但为什么左边的操作可能会以int类型结束 而我必须将其转换为short 编译器错误可能是从 int 到 Short 的有损转换 这是我的代码 public PixIm
  • 从‘const int*’到‘int*’的无效转换

    我收到以下错误 g test cpp test cpp In function int test1 const int int test cpp 11 14 error invalid conversion from const int t
  • 仅从 LastLogonDate 中提取日期部分

    我希望能够从 Get ADUser 命令的输出中分离出日期 Get ADUser identity johnd properties LastLogonDate Select Object name LastLogonDate 结果是这样的
  • 一些 Firebase 安全规则适用于 Cloud Functions 中的管理员

    更新或删除时 Cloud Function 收到 Firebase 权限被拒绝错误 服务帐户使用文件中的凭据进行初始化 以便使用auth createCustomToken当前不适用于默认帐户 admin require firebase
  • PHP 代码中给予 mysql_stmt_execute 的未知预准备语句处理程序 (0)

    我编写了一些 PHP 代码 使用 mysqli 扩展和准备好的语句将一些数据插入到 MySQL 表中 MySQL 服务器正在运行版本 5 0 77 我在运行版本 5 5 27 的机器上本地测试了代码 它运行得很好 当我将代码传输到使用旧版本
  • 在 XSL 中:如何避免选择块来包装元素?

    有一种情况 经常出现 我正在解析 XML 并通过 XSLT 1 0 生成 XHTML 文档 Case XML
  • 在哪里可以获取默认 Oracle 的“HR”模式的 SQL? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在研究 Oracle 数据库 必须使用默认的 HR 模式做一些练习 但我认为我的表中的数据已从默认值更改 许多学生可以访问数据库 并且可能是有人
  • 字符串格式化(C++)

    我尝试在控制台应用程序中格式化输出字符串 如表格 cout lt lt n n n cout lt lt setw 8 lt lt left lt lt F t cout lt lt setw 8 lt lt left lt lt x t
  • .NET 中有可序列化的通用键/值对类吗?

    我正在寻找一个可以包含在 Web 服务中的键 值对对象 我尝试使用 NETSystem Collections Generic KeyValuePair lt gt 类 但它无法在 Web 服务中正确序列化 在 Web 服务中 Key 和
  • 根据不同列中的值将多列中的值替换为 NA

    我有一个小口 A tibble 20 x 6 id X 1 Y 1 number X 2 Y 2
  • Github:我可以查看存储库的下载数量吗?

    在 Github 中 有没有办法可以查看存储库的下载数量 2019 年更新 Ustin s answer指着 API repos owner repo traffic clones 获取每天或每周的克隆总数和细分 但是 仅限过去 14 天
  • SQL Server 操作系统错误 5:“5(访问被拒绝。)”

    我开始学习 SQL 并且我有一本书提供了可以使用的数据库 下面的这些文件位于目录中 但问题是当我运行查询时 它给了我这个错误 消息 5120 级别 16 状态 101 第 1 行 无法打开物理文件 C Murach SQL Server 2
  • 如何创建动态 JSF 表单字段

    我发现了一些类似的问题 例如this一 但是有很多方法可以做到这一点 这让我更加困惑 我们正在得到一个XML我们正在阅读的文件 这XML包含一些需要呈现的表单字段的信息 所以我创建了这个自定义DynamicField java其中包含我们需
  • 如何使用 dapper 映射多个列表

    我有三个类 用户 订单 和 项目 它们存储在单个表中 订单和项目都与用户存在n n关系 为了实现这一点 我有两个交叉表 UserOrders UserProjects 来映射这些关系 public class User public str
  • 在drawable文件夹中共享png图像

    我正在将共享与应用程序的以下代码集成 private void socialShare Uri uri Uri parse android resource com example myproject drawable appicon In
  • 识别 CD

    我希望能够确定 CD 驱动器中的音乐专辑 CD 是什么 例如 如果有人声称其驱动器中的 CD 是 Eminem The Eminem Show 我希望能够验证该 CD 确实是 The Eminem Show 有任何想法吗 我已经申请了 Gr
  • 汇编将指针传递给函数

    我正在尝试将 DWORD 变量作为指针参数发送到函数中 variable1 dd 1 push variable1 push variable adress call InitPoiner InitPoiner push ebp mov e
  • 了解 posix 进程间信号量

    根据我的理解 信号量应该可以跨相关进程使用 而无需将其放置在共享内存中 如果是这样 为什么下面的代码会死锁 include