C++ 理解posix进程间信号量

C++ 理解posix进程间信号量,c++,posix,semaphore,C++,Posix,Semaphore,根据我的理解,信号量应该可以跨相关进程使用,而不必放在共享内存中。如果是这样,为什么下面的代码会死锁 #包括 #包括 #包括 使用名称空间std; 静态int MAX=100; int main(int argc,char*argv[]){ 内部检索; sem_t互斥体; cout中的措辞有点模棱两可 如果pshared为非零,则信号量在进程之间共享, 和应位于共享内存区域中 因为fork(2)创建的子对象继承其父对象的内存 映射,它还可以访问信号量 是的,但是它仍然必须在一个共享区域中。否则,

根据我的理解,信号量应该可以跨相关进程使用,而不必放在共享内存中。如果是这样,为什么下面的代码会死锁

#包括
#包括
#包括
使用名称空间std;
静态int MAX=100;
int main(int argc,char*argv[]){
内部检索;
sem_t互斥体;
cout中的措辞有点模棱两可

如果pshared为非零,则信号量在进程之间共享, 和应位于共享内存区域中

因为fork(2)创建的子对象继承其父对象的内存 映射,它还可以访问信号量

是的,但是它仍然必须在一个共享区域中。否则,内存就会被复制到通常的位置,就是这样

您至少可以通过两种方式解决此问题:

  • 使用
    sem\u open(“my\u sem”,…)
  • 使用
    shm_open
    mmap
    创建共享区域

    • 这是一篇关于这一主题的优秀文章,面向未来的路人:


      < P> < /P>你能为你正在使用的语言添加标签吗?我猜C或C++,但是它有助于搜索能力。谢谢你的回应!这里是我尝试不成功的方法……((MutX=SmithOpon(MySelphi),O-CREAT,0644, 0))= = SimiLaunt{cerr Ack!注释中的格式混乱,不知道如何修复。与其使用命名信号量,不如使用
      mmap
      匿名共享内存和
      sem_init
      在分叉之前共享它的进程。这样,您就不必担心留下一个必须清理的命名资源。@R..:true。但是,这将是正确的允许您仅在相关进程之间使用它,或者您必须通过消息传递指向共享内存的指针。当OP请求相关进程时,您在问题上下文中的注释是正确的。OTOH,如果一个命名资源的目的是同步不相关的进程,则可以稍后重新使用。
      mutex = (sem_t *) mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
      if (!mutex) {
        perror("out of memory\n");
        exit(1);
      }