如何通过Linux上的静态库同步进程?
我有一个家庭作业项目,需要创建一个STATIC库来提供对几个命名管道的相互访问。
这些管道用于使用库和服务器的各种客户端之间的通信。
现在,假设我想使用pthread互斥量; 我怎么能实现这一目标? 进程如何知道哪个是存储互斥锁的共享内存区域? 谁应该要求这个记忆区? 服务器不能,因为它需要库本身提供互斥。
感谢asveikau我想出了这个:
#define SHARED 1 #define MUTEX 1 int main() { sem_t* mutex = sem_open("mutex", O_CREAT); sem_init(mutex, SHARED, MUTEX); fork(), fork(), fork(); sem_wait(mutex); int i; for(i = 0; i < 10; i++) printf("process %d %d\n", getpid(), i), fflush(stdout); sem_post(mutex); }
从输出真的似乎解决了我的问题。
谢谢大家。
我把它作为评论,但我认为值得回答。
正如其他人所说,pthread互斥体不是跨进程的。 你需要的是一个“命名的互斥体”。 您可以使用sem_open
创建一个跨进程信号量,并为其初始计数为1.在这种情况下, sem_wait
变为“互斥锁”, sem_post
变为“互斥锁解锁”。
请注意, sem_open
虽然是POSIX的一部分,但并未得到普遍支持。 我相信它可以在Linux和Mac OS X上运行。如果你关心它,可能是Solaris(现在你可能不关心)。 我知道在OpenBSD上它始终与ENOSYS
失败。 因人而异。