c - 如何使用共享内存在进程之间共享信号量

标签 c synchronization client-server semaphore shared

我必须将 N 个客户端进程与一台服务器同步。这些进程由一个主函数派生,我在其中声明了 3 个信号量。我决定使用 POSIX 信号量,但我不知道如何在这些进程之间共享它们。我认为共享内存应该可以正常工作,但我有一些问题:

  • 如何在我的段中分配正确的内存空间?
  • 我可以在 shmgetsize_t 字段中使用 sizeof(sem_t) 来准确分配我需要的空间吗?
  • 有人有类似这种情况的例子吗?

最佳答案

共享命名的 POSIX 信号量很容易

  • 为您的信号量选择一个名称

    #define SNAME "/mysem"
    
  • 在创建它们的过程中使用 sem_openO_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/

相关文章:

c - _builtin_prefetch()中第二个参数的作用是什么?

algorithm - 与中央服务器同步联系人列表

java - 无法从多线程客户端服务器应用程序获取正确的值

python - 多个客户端不能同时监听和写入

c - C 开发人员如何使用对他们来说陌生的汇编?

C编程结构体数组的FILE输出

c - 'err_quit' 在哪里定义

wpf - 将模型的变化列表同步到 ViewModel 的 ObservableList 的最佳实践?

javascript - 双向同步(解决时间依赖)

c# - 持续检查服务器状态