如何通过Linux上的静态库同步进程?

时间:2011-09-06 19:56:45

标签: c linux pthreads

我有一个家庭作业项目,需要创建一个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);
}

从输出中确实似乎解决了我的问题。

谢谢大家。

1 个答案:

答案 0 :(得分:1)

我把它作为评论,但我认为值得回答。

正如其他人所说,pthread互斥体不是跨进程的。你需要的是一个“命名的互斥体”。您可以使用sem_open创建一个跨进程信号量,并将其初始计数为1.在这种情况下,sem_wait变为“互斥锁定”,sem_post变为“互斥锁解锁”。

请注意sem_open虽然是POSIX的一部分,但并未得到普遍支持。我相信它可以在Linux和Mac OS X上运行。如果你关心它可能是Solaris(这些天你可能不关心)。我知道在OpenBSD上它总是失败ENOSYS。 YMMV。