Linux互斥锁检查程序是否已经运行?

时间:2010-11-06 19:10:42

标签: c linux mutex

任何人都可以告诉我为什么以下内容不能作为Linux下的互斥体的一个例子

#include <pthread.h>
int main (){
pthread_mutex_t start;
if (pthread_mutex_init(&start, NULL) != 0){
     printf("err!");
     return(1);
}
if (pthread_mutex_lock(&start) != 0){
     printf("err!");
     return(1);
}

pthread_mutex_unlock(&start);
pthread_mutex_destroy(&start);
}

3 个答案:

答案 0 :(得分:8)

pthread互斥锁用于在一个程序中同步线程。如果您启动此程序两次,您将获得两个不同的互斥锁。为了在多个进程之间进行同步,还有其他工具(在这种情况下,文件锁可能是最简单的。)

答案 1 :(得分:0)

pthread互斥体旨在用于单个进程中的线程;它可能也可以工作,如果它位于共享内存中,但你在上面分配它的方式,也不会是真的。

所以调用两个程序副本,创建两个互斥体,每个都是自己的,每个人都很开心 - 除了那不是你想要的。

我认为只允许一个副本的最简单方法是打开一个文件进行写入并对其进行独占文件锁定(参见flock())。

另一种可能性是尝试在抽象命名空间中绑定unix套接字;请参阅man unix(7),但这是特定于Linux的。

答案 2 :(得分:0)

我发现一个进程检查并查看另一个进程是否处于运行状态的最佳方法是使用锁定文件,如添加信号的注释中所示。

如果程序A没有启动,活动和响应,或者程序A不负责启动程序B,但是如果程序B没有启动,程序B不应该启动,那么这很有用设定的时间量。这实际上是一种非常常见的情况。

试试这个:

  • 程序A启动,将其PID写入/var/run/a.pid
  • 程序B启动,将其PID写入/var/run/b.pid
  • 程序B读取/var/run/a.pid并向其发送SIGUSR1
  • 程序A SIGUSR1的信号处理程序读取/var/run/b.pid并将其作为ACK发送给SIGUSR1
  • 程序B知道程序A正在运行并且可以继续
  • 程序A知道程序B已经启动,并且可以改变其行为

这是极其简化和基本的IPC,但有效。更优雅的方法是通过mmap()进程之间的共享内存段,但即使这样,您也不应该信任锁,因为其他进程实际上是响应的标志,尤其是在第二个进程中没有处理饥饿的情况下。相反的情况也是如此。

这也是一个非常POSIX的答案,如果不适用,请更详细地描述您的平台。