c - 如何判断应用程序是否已经在运行? C 可移植 Linux/Win

标签 c linux windows console-application process-management

有没有办法编写 C 代码来允许我们确定应用程序的先前实例是否已经在运行?我需要在 Linux 和 Windows 上以可移植的方式检查这一点,两者都使用可用的最新版本的 GCC。

任何可移植代码的示例都会有巨大的帮助。我现在看到两个选择:

  1. 检查进程列表。这里linux有很好的工具,但我认为同样的功能不适用于windows。也许有一些适用于这两个 SO 的 gnu 库?有哪些库或函数?
  2. 保存并锁定文件。现在,如何以两个系统都能理解的方式做到这一点?一个问题是文件保存在哪里?每个系统的路径树都不同。此外,如果选择相对路径,两个应用程序仍然可以在不同目录中使用不同的锁定文件运行。

谢谢! 贝科。

PS。 SO 有不同的要求,因此如果您知道其中一项而不是另一项,请回答。毕竟,如果没有可移植的“单一”方式,我仍然可以使用#ifdef和建议的代码作为答案。

C 语言(非 C++)、控制台应用程序、gcc、linux 和 windows

最佳答案

不幸的是,如果您将自己限制在 C 语言上,那么您可能很难做到这一点。对于 C++,有 boost interprocess 的 named_mutex ,但在 C 上,您必须:

  • UNIX(包括 Mac OS):开放和 flock某处的文件。传统上,您还将当前的 PID 写入此文件。注意:这在 NFS 上可能不安全;但无论如何,你的选择非常有限。在 Linux 上,如果您想确保它是本地的并且可以安全锁定,则可以使用 /dev/shm 路径。
  • Windows:打开和锁定 named mutex

关于c - 如何判断应用程序是否已经在运行? C 可移植 Linux/Win,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589632/

相关文章:

c - 指针的第一个字符

linux - linux中真的没有超过6个参数的系统调用吗?

linux - Subversion sudo svn update 更改文件所有权和 rwx

c++ - 如何将 GDI+ 状态转换为字符串?

c# - 具有附件突出显示功能的客户端 .Net Nest

linux - 映射驱动器 URL 中的垃圾字符用于访问 WebDAV 存储

c - C语言中如何分配大内存

c - 将数组的元素添加为 a[0],a[1]+a[2],a[3]+a[4]+a[5],a[6]+a[7]+a[8] +a[9]...等等

c - 使用ffmpeg libavfilter提取亮度数据,具体为PIX_FMT_YUV420P类型

linux - 另一个 IP 如何通过我的 qMail 发送电子邮件?