2

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

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

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

谢谢!贝科。

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

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

4

4 回答 4

2

不幸的是,如果您将自己限制在 C 语言中,您可能很难在便携性上做到这一点。在 C++ 中,有 boost 进程间的named_mutex,但在 C 中,您必须:

  • UNIXes(包括 Mac OS):在某处打开并聚集一个文件。传统上,您还将当前 PID 写入此文件。注意:这在 NFS 上可能不安全;但是无论如何,您的选择非常有限。/dev/shm在 Linux 上,如果您想确保它是本地的并且可以安全锁定,则可以使用路径。
  • Windows:打开并锁定一个命名的互斥锁
于 2011-05-24T20:30:52.933 回答
2

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

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

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

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

于 2011-04-08T02:05:14.487 回答
1

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

于 2011-04-08T02:15:36.727 回答
0

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

于 2011-04-08T02:06:42.110 回答