【问题标题】:POSIX semaphores: get PIDPOSIX 信号量:获取 PID
【发布时间】:2011-09-13 20:04:47
【问题描述】:

是否可以在使用 POSIX 信号量的环境中模拟 System V 原语semctl(semid,0,GETPID,0)

如果不可能,我正在寻找一种方法来知道谁对信号量进行了最后一次操作,我会更好地解释......

我正在开发一个带有预分叉子的 UDP 服务器。父亲处理 SIGCHLD 以重生一个死去的孩子。如果一个孩子在临界区死亡(即它还没有完成 sem_post),父亲必须认识到这种情况并解锁信号量。

【问题讨论】:

  • 根据man semctl它在Linux和POSIX.1-2001中
  • @Drakosha semctl 用于不同的 API。

标签: c semaphore


【解决方案1】:

我认为做不到。我没有看到标准中提到过这样的事情。最好的办法是确保应用程序没有理由死在关键部分。

您可能会考虑将一些状态信息附加到每个信号量(“谁在这个信号量上最后一次 DOWN?”)。但是,如果允许多个进程对信号量进行关闭(信号量以大于 1 的值开始),您将不得不同步它们更新该信息的方式 - 回到第 1 格。

【讨论】:

  • 现在我做了一个解决方法:在孩子的身体里,我已经阻止了除了 SIGUSR1 之外的所有信号,这是父亲用来关闭所有孩子的信号。显然,我没有受到 SIGKILL 的保护。
【解决方案2】:

你想做的事是做不到的。您可以通过基于 POSIX 健壮互斥量编写自己的信号量来部分模拟该行为(但它会有一些缺点,例如不是异步信号安全),或者您可以只使用健壮互斥量而不是信号量开始。

【讨论】:

  • 我觉得“自定义路径”对我来说太贵了。我只找到了一种在繁重进程之间创建共享互斥锁的方法:初始化为 1 的命名信号量。
  • 而不是只使用包含健壮互斥体的命名共享内存... (shm_open) 或者更好的是,将它放在文件系统中的一个文件中,然后 mmap 那个。然后,您可以在文件第一次打开/创建时使用 fcntl 锁定进行稳健的初始化。
猜你喜欢
  • 2011-07-04
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多