我必须将 N 个客户端进程与一台服务器同步。这些进程由一个主函数派生,我在其中声明了 3 个信号量。我决定使用 POSIX 信号量,但我不知道如何在这些进程之间共享它们。我认为共享内存应该可以正常工作,但我有一些问题:
- 如何在我的段中分配正确的内存空间?
- 我可以在
shmget
的size_t
字段中使用sizeof(sem_t)
来准确分配我需要的空间吗? - 有人有类似这种情况的例子吗?
最佳答案
共享命名的 POSIX
信号量很容易
为您的信号量选择一个名称
#define SNAME "/mysem"
在创建它们的过程中使用
sem_open
和O_CREAT
sem_t *sem = sem_open(SNAME, O_CREAT, 0644, 3); /* Initial value is 3. */
在其他进程中打开信号量
sem_t *sem = sem_open(SEM_NAME, 0); /* Open a preexisting semaphore. */
如果你坚持使用共享内存,那肯定是可以的。
int fd = shm_open("shmname", O_CREAT, O_RDWR);
ftruncate(fd, sizeof(sem_t));
sem_t *sem = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
sem_init(sem, 1, 1);
我还没有测试过上面的内容,所以它可能完全是疯子。
关于c - 如何使用共享内存在进程之间共享信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8359322/