在 C 语言中使用 POSIX 在多个进程(不是线程,仅进程)之间共享二进制信号量
Posted
技术标签:
【中文标题】在 C 语言中使用 POSIX 在多个进程(不是线程,仅进程)之间共享二进制信号量【英文标题】:Making binary semaphore shared between multiple processes(not threads , Process Only) using POSIX in C language 【发布时间】:2015-11-16 08:14:05 【问题描述】:我正在使用 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()
?
但您建议的方法是用于计数信号量。如果我正在服用 sem_t *sem_id;然后它正在创建一个计数信号量。我需要二进制信号量。所以问了这个问题!
哎呀,我想知道如果我启动一个初始值为 1 的计数信号量,我会得到什么样的信号量。
***中很多人都回答过。但是,即使我以 1 启动,我也没有得到二进制信号量。它仍在计数信号量!
【参考方案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);
【讨论】:
二进制信号量我的意思是,如果我们做多个帖子,那么信号量的值应该保持为 1,因为这是严格二进制信号量的理论概念。但是,如果我将信号量的值初始化为 1 并对其调用 post 操作,那么它的值会从 1 增加,这会导致执行多个等待操作,与计数信号量相同。二进制信号量不应该是这种情况。 为什么要发布到未锁定的信号量?您所描述的在功能上是互斥体。 但是,互斥锁只能在一个进程和多个线程中使用。但我想要进程之间的同步。因此我正在寻找严格的二进制信号量。 你可以做两件事之一来获得互斥体语义。您可以在解锁时限制发布到信号量,也可以使用文件锁定。我已经为上面的文件锁添加了代码。以上是关于在 C 语言中使用 POSIX 在多个进程(不是线程,仅进程)之间共享二进制信号量的主要内容,如果未能解决你的问题,请参考以下文章