我希望在共享内存中使用匿名信号量来同步多个进程。
虽然多个POSIX操作系统提供匿名信号量(通过
我发现Mach信号量在macOS上可用,但是在
这是我目前如何使用信号量的方式(请注意,
用于初始化信号量:
等待它:
所有上述代码示例都实际包含在相应的函数中,这些函数允许提供一个与操作系统无关的API。我在Linux上对这些函数进行的测试调用按预期工作,但在macOS上,等待信号量的进程从其他进程中得不到信号。
虽然多个POSIX操作系统提供匿名信号量(通过
sem_init
和相关函数),但macOS不支持它们。我发现Mach信号量在macOS上可用,但是在
semaphore_create
中,我没有看到与sem_init
的pshared
参数相当的内容,而且我很难找到文件说明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表示不应将其与使用虚拟内存的进程一起使用,在其他术语中就是...所有用户进程?
semaphore_t
是另一个mach_port_t
typedef,因此我的假设是要在进程之间共享信号量,您需要使用Mach消息将创建它的进程发送信号量端口给共享它的进程。 (mach_msg
)您是如何共享对信号量的访问权限的?如果您只传输字面整数值,则无法正常工作,因为每个进程都有私有端口名称表。 - pmdjmach_msg
,感谢您的建议! - Pop Flamingo