在 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 在多个进程(不是线程,仅进程)之间共享二进制信号量的主要内容,如果未能解决你的问题,请参考以下文章

PHP进程及进程间通信

如何在 c 中使用 posix 命名信号量和 Linux 上两个进程之间的共享内存?

C语言中exit函数的使用

(POSIX)操作系统是不是会在进程崩溃后恢复资源?

POSIX C 中 fork() 的更轻量级替代品?

C语言中exit();怎么用?