限制程序只运行一个实例

时间:2012-04-17 23:29:49

标签: c

这是一个简单的“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可执行文件,第二个就在第一个完成后运行?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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暗示这个解决方案(我将其作为答案)。