2012-04-17 79 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

相關問題