C 要创建多少信号量?

C 要创建多少信号量?,c,semaphore,shared-memory,C,Semaphore,Shared Memory,我知道信号量用于同步进程以访问共享内存 基本上我不明白要创建多少信号量 假设我只有一段共享内存,两个进程将访问它。然后,只创建一个信号量 但若我有三个或更多的进程将访问相同的共享内存,那个么它需要更多的信号量集吗 创建信号量集的数量取决于什么条件 提前谢谢。看看Pearce Wiki 共享内存中有一个pthreads互斥体和条件变量 而是一个信号灯。您可以将此解决方案扩展到两个以上的进程。如果您使用的是semctl(IPC信号量),则需要创建一个信号量。如果您使用的是POSIX信号量(sem_i

我知道信号量用于同步进程以访问共享内存

基本上我不明白要创建多少信号量

假设我只有一段共享内存,两个进程将访问它。然后,只创建一个信号量

但若我有三个或更多的进程将访问相同的共享内存,那个么它需要更多的信号量集吗

创建信号量集的数量取决于什么条件


提前谢谢。

看看Pearce Wiki 共享内存中有一个pthreads互斥体和条件变量
而是一个信号灯。您可以将此解决方案扩展到两个以上的进程。

如果您使用的是semctl(IPC信号量),则需要创建一个信号量。如果您使用的是POSIX信号量(sem_init),那么也可以使用一个,但前提是在创建时为pshared参数传递一个真值并将其放在共享内存中

信号量可以跨线程或进程共享。跨进程共享是在操作系统级别实现的。两个或多个不同的进程可以共享相同的信号量,即使这些进程不是通过分叉单个父进程创建的

两种类型的信号量是sysV和POSIX。查找有关差异的更多信息,请访问

sysV信号量是在内核中维护的,因此您不需要为它们分配空间或将它们放在共享内存中来共享它们。但您确实需要为每个使用它们的进程找到它们的方法

有关在父进程及其子进程之间共享未命名UNIX信号量的信息,请参见此示例(要使用gcc编译,需要-pthread标志):

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
/*将信号量放在共享内存中*/
sem_t*sema=mmap(NULL,sizeof(sema),
保护读取、保护写入、地图共享、地图匿名、,
-1, 0);
if(sema==MAP_失败){
佩罗尔(“mmap”);
退出(退出失败);
}
/*创建/初始化信号量*/
if(sem_init(sema,1,0)<0){
perror(“sem_init”);
退出(退出失败);
}
int nloop=10;
int-pid=fork();
if(pid<0){
佩罗尔(“福克”);
退出(退出失败);
}
如果(pid==0){
/*子进程*/

它不取决于访问资源的进程的数量。信号量用于避免同时访问资源。如果只有一个资源,请使用一个资源初始化信号量。一旦一个进程获取了资源,其他两个或多个进程将等待资源释放。一旦根据pro释放了资源cess状态/调度另一进程之一将占用资源

顺序会是这样的

使用一个资源初始化: sem_init()

获取资源: sem_wait()或sem_timedwait()

释放资源:
sem_post()

您的意思是,无论访问共享内存的进程是两个还是多个,都只需要一个信号量集吗?
semctl()
?信号量集不是单个值,而是一组值。它通过包含多个信号量的信号量集来引用。每个信号量集由标识信号量集的semid和标识集中信号量的semnum标识。可以在一个
semop()
调用。这些操作是一个信号量集中多个信号量的原子操作。
#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>

int main(void)
{
  /* place semaphore in shared memory */
  sem_t *sema = mmap(NULL, sizeof(sema), 
      PROT_READ |PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,
      -1, 0);
  if (sema == MAP_FAILED) {
    perror("mmap");
    exit(EXIT_FAILURE);
  }

  /* create/initialize semaphore */
  if ( sem_init(sema, 1, 0) < 0) {
    perror("sem_init");
    exit(EXIT_FAILURE);
  }
  int nloop=10;
  int pid = fork();
  if (pid < 0) {
    perror("fork");
    exit(EXIT_FAILURE);
  }
  if (pid == 0) { 
    /* child process*/