gpt4 book ai didi

c - 使用 Mach 信号量代替进程间匿名信号量

转载 作者:行者123 更新时间:2023-12-04 13:54:27 26 4
gpt4 key购买 nike

我想在共享内存中使用匿名信号量来同步多个进程。
虽然多个 POSIX 操作系统提供匿名信号量(通过 sem_init 和相关函数),但 macOS 不支持它们。
我发现 Mach 信号量在 macOS 上可用,但在 semaphore_create ,我看没有等同于 pshared sem_init 的参数而且我很难找到表明 Mach/XNU 信号量实际上可以用于同步进程而不仅仅是线程的文档。是否可以?
这是我目前使用信号量的方式(请注意,sema 是一种包含不同类型信号量的结构,具体取决于目标操作系统,例如它在 Linux 上包含一个 sem_t 信号量):
用于初始化信号量:

task_t task = current_task();
semaphore_create(task, &sema->semaphore, SYNC_POLICY_FIFO, value)
等待它:
semaphore_wait(sema->semaphore);
等待超时(与 Linux 上的 sem_timedwait 等效):
mach_timespec_t time;
time.tv_sec = seconds;
time.tv_nsec = useconds;
semaphore_timedwait(sema->semaphore, time);
发出信号:
semaphore_signal(sema->semaphore);
上述所有代码示例实际上都包含在允许提供与操作系统无关的 API 的相应函数中,我在 Linux 上对这些函数进行的测试调用按预期工作,但在 macOS 上,等待信号量的进程从未发出信号另一个过程。
我究竟做错了什么?
编辑
我在 the docs 中找到了这个:

Semaphores can be used any place where mutexes can occur. Thisprecludes their use in interrupt handlers or within the context of thescheduler, and makes it strongly discouraged in the VM system.


“调度程序的上下文”究竟指的是什么?如果您正在编写自己的调度程序,或者这是否涉及与调度程序的任何交互(例如:进程)。
在所有情况下,VM 是否意味着它不应该与使用虚拟内存的进程一起使用,换句话说......所有用户进程?

最佳答案

Mach 信号量可以跨进程使用,但是需要用 mach_msg 将它们的端口句柄移动到另一个进程,这有点痛苦。
但是 - 当您没有 POSIX 信号量,而是 Sys V 信号量时,为什么要去那里? sem_init 可能不可用,但完全支持 Sys V 信号量。
具体来说,您正在查看以下系统调用:

  • semsys
  • semctl
  • semget
  • semop :在其之上您有 sem_post(2) 和其他一些 sem_* 操作
  • sem_unlink
  • sem_close

  • sem_open 在文件系统上采用信号量路径,创建一个命名信号量,该信号量也将在您的其他进程中可见。 sem_wait 等。

    关于c - 使用 Mach 信号量代替进程间匿名信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65166614/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com