繁体   English   中英

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

[英]Linux mutex to check that the program is already running?

谁能告诉我以下内容为什么不能在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);
}

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

pthread互斥锁旨在在单个进程中的线程中使用; 如果它位于共享内存中,它也可能会起作用,但是您在上面分配它的方式都不正确。

因此,调用该程序的两个副本,创建两个互斥体,每个互斥体都有自己的,每个人都很高兴-除非那不是您想要的。

我认为,仅允许一个副本的最简单方法是打开一个文件进行写入,并对它进行排他的文件锁定(请参阅flock())。

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

我发现一个进程检查并查看另一个进程是否仍在运行的最好方法是使用锁定文件,如注释中所建议的,并添加了信号。

如果程序B尚未启动,运行且响应良好,或者程序A不负责启动程序B,但如果程序B并未启动一定数量的启动程序,但程序B不应执行启动操作,或者程序A不负责启动程序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并将其发送给SIGUSR1作为ACK
  • 程序B知道程序A正在运行并且可以继续
  • 程序A知道程序B已启动,并且可以更改其行为

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM