当前位置: 首页 > 知识库问答 >
问题:

是否可以使用带有POSIX信号量的System V共享内存?

阳建弼
2023-03-14

我有两个使用System V共享内存进行通信的程序。

这两个程序都正常工作,但我想添加命名信号量以避免竞争条件。

我尝试了以下方法:

sem_t *sem = sem_open("/semaphorename", O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, 0);

if(sem == SEM_FAILED){
    sem = sem_open("/semaphorename", 0);
}

while(1){
    /*get input from user */
    sem_wait(sem);
    /* write to shared memory. If QUIT is entered, break from while loop */
    sem_post(sem);
}
sem_close(sem);
sem_unlink("/semaphorename");

没有信号量,程序可以工作,但有了信号量,共享内存中不会写入任何内容。我做错了什么?当我使用System V共享内存时,是否可能使用这些信号量?

共有1个答案

羊舌志
2023-03-14

由于信号量的初始值为0,因此sem_wait()将永远等待,直到有人执行sem_post()。因此,只在其中一个程序中用一个sem_post()初始化信号量。

 类似资料:
  • 我在编写一些简单的代码来自学信号量和POSIX共享内存时遇到了问题。 其思想是一个程序,即服务器,打开共享内存并向其中写入一个结构(包含信号量和数组)。然后它等待输入,输入之后信号量递增。 同时,客户端打开共享内存,等待信号量,在服务器增加信号量之后,读取结构。 服务器似乎工作正常,但是我在客户端的函数处立即遇到了一个segfault(甚至在服务器增加它之前)。我想不出哪里出了问题。 服务器代码:

  • 它编译得很好,但是当我试图运行它时,当它到达部分时,我得到了一个分段错误。我在其他地方读到过,不应该创建指向信号量的指针,但是当我没有创建并尝试时,我遇到了一个关于需要lvalue的错误。任何帮助都将不胜感激。

  • 我想创建一个共享内存和信号量的C程序。应该有两个子进程。两个孩子都有一个不同的int数。然后有一个目标号码,应该写在共享内存中。现在两个孩子都应该从进球数中减去他们的数字,直到进球数低于或等于0。我不希望出现比赛条件。这就是为什么我尝试使用信号量。但对我没用。下面是我的代码:

  • 我需要编写一个程序,它正在创建N个数量的子进程,每一个进程都将一个添加到共享内存变量中。我的想法是使用信号量和共享内存,但进程之间并没有相互等待,共享内存变量也没有像我希望的那样工作。 MyDefs.H Main.C 奴隶Proc.c