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



我想在共享内存中使用匿名信号量来同步多个进程
虽然多个POSIX操作系统提供匿名信号量(通过sem_init和相关函数(,但macOS不支持它们。

我发现macOS上有Mach信号量,但在semaphore_create中,我看不到与sem_initpshared参数等效的信号量,而且我很难找到表明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上,等待信号量的进程从未从其他进程发出信号。

我做错了什么?

编辑

我在文档中找到了这个:

信号量可以在任何可能发生互斥的地方使用。这排除了它们在中断处理程序中或在调度器,并使其在VM系统中被强烈劝阻。

;调度器的上下文";具体指的是什么?如果您正在编写自己的调度程序,或者这是指与调度程序的任何交互(例如:进程(。

在所有情况下,VM意味着它不应该与使用虚拟内存的进程一起使用,换句话说。。。所有用户流程?

Mach信号量可以跨进程使用,但这需要将其带有Mach_msg的端口句柄移动到另一个进程,这有点麻烦。

但是,当你没有POSIX信号量,而是Sys V信号量时,为什么要去那里呢?sem_init可能不可用,但完全支持Sys V信号量。

具体来说,您正在查看以下系统调用:

  • semsys
  • semctl
  • semget
  • semop:在它上面有sempost(2(和其他一些sem*操作
  • sem_unlink
  • sem_close

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

最新更新