我想在共享内存中使用匿名信号量来同步多个进程
虽然多个POSIX操作系统提供匿名信号量(通过sem_init
和相关函数(,但macOS不支持它们。
我发现macOS上有Mach信号量,但在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意味着它不应该与使用虚拟内存的进程一起使用,换句话说。。。所有用户流程?
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等。