使用C语言和POSIX将二进制信号量在多个进程之间共享(仅限进程,不是线程)。

3

我正在使用C语言中的POSIX创建一个在多个进程之间共享的二进制信号量(而不是线程,仅限进程)。 如果我使用互斥锁来创建二进制信号量,

 typedef struct BIN_SEMA
  { 
     pthread_cond_t  cv;    /* cond. variable 
                                   - used to block threads */
     pthread_mutex_t mutex; /* mutex variable
                             - used to prevents concurrent
                                    access to the variable "flag" */
     int     flag;          /* Semaphore state: 
                                    0 = down, 1 = up */
   } bin_sema;

我只能在线程中使用它,但我想在进程之间共享。 所以我的问题是, 如何使用POSIX计数信号量创建二元信号量?


你为什么要像那样创建一个二进制信号量呢?mutex本身已经是一个二进制信号量了。而且,如果你要同步不同的进程,为什么不使用适当的机制来实现:sem_open()sem_init()sem_wait()sem_post()sem_unlink()呢? - EOF
但是您提供的方法是用于计数信号量。如果我使用sem_t *sem_id;那么它会创建一个计数信号量,而我需要二进制信号量。因此我才问这个问题! - KrunalParmar
我在想,如果我使用初始值为1的计数信号量,我会得到什么样的信号量呢? - EOF
这个问题在stackoverflow上被很多人回答过。但是,即使我从1开始初始化,我仍然得不到二进制信号量...它仍然是计数信号量! - KrunalParmar
1个回答

2

“二进制信号量”是什么意思并不清楚。如果您指的是可以有两种状态的东西,那么互斥锁或初始化为1的信号量在功能上都是等效的。

如果您想要在进程之间共享信号量,可以使用命名信号量...

sem_t* sem = sem_open("/APP/SEMAPHORE", O_CREAT, (S_IRUSR | S_IWUSR), 1);

sem_wait(sem);

// do stuff

sem_post(sem);

// do more stuff

sem_unlink("/APP/SEMAPHORE");

为了在多个进程间强制使用互斥锁,你可以使用一个文件...
const char* lock_file = ".lock";

const int fd_lock = open(lock_file, O_CREAT);

flock(fd_lock, LOCK_EX);

// do stuff

flock(fd_lock, LOCK_UN);

// do more stuff

close(fd_lock);    
unlink(lock_file);

通过二进制信号量,我指的是如果我们进行多个post操作,则信号量的值应保持为1,因为这是严格二进制信号量的理论概念。 但是,如果我将信号量的值初始化为1并对其进行post操作,则它的值会从1增加,这会导致执行多个wait操作,就像计数信号量一样。这在二进制信号量中不应该发生。 - KrunalParmar
为什么你要向一个未加锁的信号量发帖?您所描述的功能实际上是互斥锁。 - Jason
但是,互斥锁只能在一个进程和多个线程中使用。但我想要进程间的同步。因此,我正在寻找严格的二进制信号量。 - KrunalParmar
你可以采取以下两种方式来获得互斥量语义。一种是在未锁定时限制对信号量的发布,另一种是使用文件锁。我已经添加了文件锁的代码。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接