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

4
我希望在共享内存中使用匿名信号量来同步多个进程。
虽然多个POSIX操作系统提供匿名信号量(通过sem_init和相关函数),但macOS不支持它们。
我发现Mach信号量在macOS上可用,但是在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信号量,但我已经与macOS的Mach原语工作了很多。问题/建议:我注意到在用户空间中,semaphore_t是另一个mach_port_t typedef,因此我的假设是要在进程之间共享信号量,您需要使用Mach消息将创建它的进程发送信号量端口给共享它的进程。 (mach_msg)您是如何共享对信号量的访问权限的?如果您只传输字面整数值,则无法正常工作,因为每个进程都有私有端口名称表。 - pmdj
谢谢!不,我没有使用mach_msg,感谢您的建议! - Pop Flamingo
1个回答

1
Mach信号量可以在进程间使用,但需要使用mach_msg将其端口句柄移动到另一个进程中,有点麻烦。但是,既然有Sys V信号量,为什么要去那里呢?sem_init可能不可用,但是Sys V信号量得到了完全支持。具体来说,您需要查看以下系统调用:semsys、semctl、semget、semop(在其上有sem_post(2)和其他几个sem_*操作)、sem_unlink和sem_close。sem_open接受文件系统上的信号量路径,创建一个命名信号量,在其他进程中也可见。sem_wait等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接