Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定应用程序是否已在运行?C便携式Linux/Win_C_Linux_Windows_Console Application_Process Management - Fatal编程技术网

如何确定应用程序是否已在运行?C便携式Linux/Win

如何确定应用程序是否已在运行?C便携式Linux/Win,c,linux,windows,console-application,process-management,C,Linux,Windows,Console Application,Process Management,有没有一种方法可以编写一个C代码来确定应用程序的前一个实例是否已经在运行?我需要在Linux和Windows上以可移植的方式检查这一点,这两个版本都使用最新版本的GCC 任何可移植代码的例子都会有巨大的帮助。我现在看到两种选择: 检查流程列表。在这里,linux有很好的工具,但我不认为同样的功能适用于windows。也许两个都有gnu库,是吗?哪些库或函数 保存并锁定文件。现在,如何以两个系统都能理解的方式做到这一点?一个问题是在哪里保存文件?每个系统的路径树都不同。此外,如果选择了相对路径,两

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

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

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

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


    C语言(不是C++)、控制台应用程序、gcc、linux和windows对于windows,互斥锁工作良好

    这篇文章还提到了互斥的一种替代方法


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

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

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

    不幸的是,如果您将自己限制为C,则在移植时可能会遇到困难。用C++,有Boost的进程,但是在C上,你必须要么:

    • Unix(包括Mac OS):打开并在某处创建一个文件。传统上,您也会将当前PID写入此文件。注意:这在NFS上可能不安全;但无论如何,你的选择非常有限。在Linux上,如果您想确保它是本地的并且可以安全地锁定,那么可以使用
      /dev/shm
      路径
    • 窗口:打开并锁定一个窗口

    • 对于Windows,考虑基思的答案。我不确定它是否有效,但是,你可以试试。嗨,基思。该目录的完整路径是什么?是否有一个有效的变量?我编辑了这个问题,以解释在两种系统中尝试这样做时的一些疑问。谢谢你的时间!