2

这是一个简单的“hello world”C 程序,需要 10 秒才能完成:

#include<stdio.h>
main()
{
    printf("hello World 1 \n");
    fflush(stdout);
    sleep(10);
    printf("hello World 2 \n");
    fflush(stdout);
}

我怎样才能修改它,以便在任何时候最多只能运行这个可执行文件的一个实例?我正在使用 Linux。

例如,假设同时运行多个实例时服务器会崩溃,我们正在努力防止这种情况发生。我希望看到一个或多个不同方式的示例,以便我可以在我的系统上运行和验证。

另外,有没有一种简单的方法来排队,所以如果我连续两次运行 C 可执行文件,第二个在第一个完成后运行?

4

2 回答 2

5

通常,您通常会获得一个文件锁,创建一个给定文件名的运行时文件,其中进程 PID 作为初始化时的内容(在 UNIX 系统中通常在/var/run/)。退出时删除文件。

如果文件在启动期间已经存在,则另一个实例已经在运行。

于 2012-04-17T23:33:03.053 回答
0

假设我们命名我们的 C 程序hello.c,并使用: 编译它gcc -g hello.c -o hello.exe。现在我们不再直接运行可执行文件,而是创建一个 bash 脚本来运行它。bash 脚本检查是否存在虚拟锁文件,表明 C 程序正在运行。如果此锁定文件不存在,它会创建一个以让将来对该 bash 脚本的调用知道 C 程序正在运行。这是 bash 脚本:

#!/bin/sh
if [ ! -f dummy.file ];
then
    echo "File not found. Let's create one now, then run hello.exe."
    echo 'locked'> dummy.file
    ./hello.exe
else
    echo "File dummy.file exists, so hello.exe is not run."
fi

现在我们只需要在上面的 C 程序中添加一些代码,让它在程序末尾删除文件,如下所示:

#include<stdio.h>
main()
{
    printf("hello World 1 \n");
    fflush(stdout);
    sleep(10);
    printf("hello World 2 \n");
    fflush(stdout);

    if (remove("dummy.file") == -1)
      perror("Error in deleting lock file");
 }

非常简单。感谢 skjaidev 暗示了这个解决方案(我将把它作为答案)。

于 2012-04-18T00:30:40.553 回答