【问题标题】:How to determine if the application is already running? C portable Linux/Win如何确定应用程序是否已经在运行? C 便携式 Linux/Win
【发布时间】:2011-08-01 04:05:31
【问题描述】:

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

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

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

谢谢! 贝科。

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

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

【问题讨论】:

    标签: c linux windows console-application process-management


    【解决方案1】:

    对于 Windows,互斥体效果很好。

    http://msdn.microsoft.com/en-us/library/ms682411(v=vs.85).aspx

    该文章还提到了互斥锁的替代方案....

    要将您的应用程序限制为每个用户一个实例,请在用户的配置文件目录中创建一个锁定文件。

    【讨论】:

    • 嗨@Keith。该目录的完整路径是什么?有一个有效的变量吗?我编辑了这个问题,以解释在两个系统中尝试执行此操作时的一些疑问。感谢您的宝贵时间!
    【解决方案2】:

    C 没有提供内置工具来检查应用程序是否已经在运行,因此,使其跨平台是困难/不可能的。但是,在 Linux 上,可以使用IPC。而且,在 Windows 上(我在这一类方面不是很有经验),您可能会发现 this 很有帮助。

    【讨论】:

    • 对于 Windows,请考虑 Keith 的回答。我不确定它是否有效,但是,你可以试试。
    【解决方案3】:

    Unixland 中的一种规范方法是让进程将自己的 PID 写入已知位置的文件中。如果这个文件存在,那么程序可以检查它自己的 pid(通过系统调用获得)与那个文件中的那个,如果它不熟悉你就知道另一个进程正在运行。

    【讨论】:

      【解决方案4】:

      不幸的是,如果您将自己限制在 C 语言中,那么您可能难以移植。在 C++ 中,有 boost 进程间的 named_mutex,但在 C 中,您必须:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多