了解posix进程间信号量
Understanding the posix interprocess semaphore
根据我的理解,信号量应该可以跨相关进程使用,而不需要放在共享内存中。如果是这样,为什么下面的代码会死锁?
#include <iostream>
#include <semaphore.h>
#include <sys/wait.h>
using namespace std;
static int MAX = 100;
int main(int argc, char* argv[]) {
int retval;
sem_t mutex;
cout << sem_init(&mutex, 1, 0) << endl;
pid_t pid = fork();
if (0 == pid) {
// sem_wait(&mutex);
cout << endl;
for (int i = 0; i < MAX; i++) {
cout << i << ",";
}
cout << endl;
sem_post(&mutex);
} else if(pid > 0) {
sem_wait(&mutex);
cout << endl;
for (int i = 0; i < MAX; i++) {
cout << i << ",";
}
cout << endl;
// sem_post(&mutex);
wait(&retval);
} else {
cerr << "fork error" << endl;
return 1;
}
// sem_destroy(&mutex);
return 0;
}
当我在Gentoo/Ubuntu Linux上运行这个时,父进程挂起。显然,它没有收到孩子的邮件。取消对sem_destroy的注释不会有任何好处。我错过什么了吗?
更新1:
mutex = (sem_t *) mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
if (!mutex) {
perror("out of memoryn");
exit(1);
}
谢谢,里。
手册页的措辞有点模棱两可。
如果pshared非零,则信号量在进程之间共享;和应该位于共享内存的区域。
因为fork(2)创建的子进程继承父进程的内存映射,它也可以访问信号量。
是的,但是它仍然必须在共享区域中。否则,内存只会用通常的CoW进行复制,就这样。
你至少可以用两种方法解决这个问题:
- 使用
sem_open("my_sem", ...)
- 使用
shm_open
和mmap
创建共享区域
关于这个主题的一篇优秀的文章,对于未来的路人:
http://blog.superpat.com/2010/07/14/semaphores-on-linux-sem_init-vs-sem_open/相关文章:
- 删除旧的信号量系统V
- 父进程和子进程之间的 POSIX 信号量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 单车道桥 使用信号量进行同步
- 用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 发布信号量返回错误 6(无效句柄)
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 如何让一个线程继续,而另一个线程正在等待C++中的信号量
- 实现信号量
- 计算信号量还是互斥体?
- POSIX 信号量在高争用/负载下不起作用
- 如何使用Windows API直接将进程"assign"到信号量?
- C++ System V 信号量:多个服务器进程,一个客户端进程
- 互斥锁和信号量之间的区别 - 进程内和进程间
- Linux 信号量,跨分叉>exec'd 进程共享?
- 了解posix进程间信号量