2012-04-17 77 views
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的可执行文件,第二个刚刚在第一个完成后运行?

+0

通常您需要外部看门狗/启动程序来执行此类服务。 – Anycorn 2012-04-17 23:33:09

+0

我认为你不了解评论。我认为他的意思是另一种工具来完成你所要求的工作。 – m0skit0 2012-04-17 23:38:33

+0

类似http://mmonit.com/monit/?但是我认为我误解了你的问题 - 你对运行守护进程并不感兴趣? – Anycorn 2012-04-17 23:40:21

回答

5

通常你平时获取文件锁定,(通常在/var/run/在UNIX系统)创建一个给定的文件名与过程PID运行时文件在初始化时的内容。退出时删除文件。

如果该文件在启动过程中已经存在,则另一个实例已在运行。

+0

在POSIX系统上,您可以使用'open()'选项'O_CREAT'和'O_EXCL'。这将检查文件的存在并在必要时将其创建为单个原子操作。如果打开成功,您肯定知道该文件已不存在,所以您的程序是允许运行的程序。如果文件已经存在,则打开将失败,所以您知道该程序的另一个实例已在运行。 – Wyzard 2012-04-17 23:35:14

+1

请参阅:http://beej.us/guide/bgipc/output/html/multipage/flocking.html,man fopen等。 – jman 2012-04-17 23:35:45

+0

根据这个答案查看我的答案。 – ggkmath 2012-04-18 00:32:47

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暗示这个解决方案(为此我将给出信用作为答案)。

+0

由于您不使用文件锁定,因此可能会有两个(或多个程序正在运行)实例。这一切都取决于时间,因为检查文件的存在和创建文件在代码中不是原子的。 – jman 2012-04-18 01:10:03

相关问题