我有两个使用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共享内存时,是否可能使用这些信号量?
由于信号量的初始值为0,因此sem_wait()
将永远等待,直到有人执行sem_post()
。因此,只在其中一个程序中用一个sem_post()
初始化信号量。
我在编写一些简单的代码来自学信号量和POSIX共享内存时遇到了问题。 其思想是一个程序,即服务器,打开共享内存并向其中写入一个结构(包含信号量和数组)。然后它等待输入,输入之后信号量递增。 同时,客户端打开共享内存,等待信号量,在服务器增加信号量之后,读取结构。 服务器似乎工作正常,但是我在客户端的函数处立即遇到了一个segfault(甚至在服务器增加它之前)。我想不出哪里出了问题。 服务器代码:
它编译得很好,但是当我试图运行它时,当它到达部分时,我得到了一个分段错误。我在其他地方读到过,不应该创建指向信号量的指针,但是当我没有创建并尝试时,我遇到了一个关于需要lvalue的错误。任何帮助都将不胜感激。
代码是:
我想创建一个共享内存和信号量的C程序。应该有两个子进程。两个孩子都有一个不同的int数。然后有一个目标号码,应该写在共享内存中。现在两个孩子都应该从进球数中减去他们的数字,直到进球数低于或等于0。我不希望出现比赛条件。这就是为什么我尝试使用信号量。但对我没用。下面是我的代码:
null
我需要编写一个程序,它正在创建N个数量的子进程,每一个进程都将一个添加到共享内存变量中。我的想法是使用信号量和共享内存,但进程之间并没有相互等待,共享内存变量也没有像我希望的那样工作。 MyDefs.H Main.C 奴隶Proc.c