2011-04-08 39 views
2

有没有办法编写一个C代码,让我们确定一个应用程序的前一个实例是否已经在运行?我需要用Linux和Windows的便携方式来检查它们,两者都使用最新版本的GCC可用。如何确定应用程序是否已在运行? C portable Linux/Win

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

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

谢谢! Beco。

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

C语言(不是C++),控制台应用程序,GCC,Linux和Windows

回答

1

不幸的是,如果你限制自己到C,你可能会很难做到这一点。随着C++,有升压进程间的named_mutex,但在C,你将不得不采取:

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

用于窗户,互斥效果很好。

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

文章还提到一个互斥体的替代....

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

+0

嗨@Keith。该目录的完整路径是什么?有没有可用的变量?我编辑了这个问题,解释了在两个系统中尝试这样做时出现的一些疑问。谢谢你的时间! – 2011-04-13 06:39:17

0

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

+0

对于windows,请考虑Keith的答案。我不确定它是否有效,但是,您可以尝试。 – 2011-04-08 02:07:05

1

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

相关问题