2012-09-28 41 views
1

我有這個應用程序,它是一個用於檢測和監視設備的守護程序。它接受參數,然後打印哪些設備可用。例如多次執行程序而不復制實例

./udevmon -s //prints the devices that are connected to my server. 

樣本輸出

Device: /dev/ttyUSB0 subsystem: tty 

現在,當我再次運行它來檢查哪些設備可用,打字./udevmon -s再次它將創建一個具有不同的進程id ./udevmon的第二instace。當我輸入沒有參數的./udevmon時,它會用不同的進程ID再次創建一個新的實例,現在總共有3個./udevmon進程。這會讓我的系統變慢,因爲我需要多次運行./udevmon。

如何運行我的應用程序,以便它只創建一個實例。例如,當我再次鍵入./udevmon -s或./udevmon時重新啓動它?

以下是示例代碼。

int main (int argc, char *argv[]) 
{  
    mon_init();  // initialize device monitor 
    scan_init();  // initialize device scan 

    //Fork the Parent Process 
    pid = fork(); 
    if (pid < 0) { exit(EXIT_FAILURE); } 

    //We got a good pid, Close the Parent Process 
    if (pid > 0) { exit(EXIT_SUCCESS); } 

    //Change File Mask 
    umask(0); 

    //Create a new Signature Id for our child 
    sid = setsid(); 
    if (sid < 0) { exit(EXIT_FAILURE); } 

    //Change Directory 
    //If we cant find the directory we exit with failure. 
    if ((chdir("/")) < 0) { exit(EXIT_FAILURE); } 

    while((c=getopt(argc, argv,"s")) != -1) { 
     switch(c) { 
      case 's': scan_run(); break; 
      default: printf("wrong command\n"); 
     } 
    } 

    //Main Process 
    while(1) { 
     start_mon(); 
    } 
    udev_unref(udev); 
    return 0;  
} 
+1

保持運行狀態:

killall -KILL udevmon &> /dev/null ./udevmon <ARG> 

你可以輕輕地使用下面的腳本做同樣與上面一些通知殺呢? –

+0

如何創建一個'udevmon.pid'文件,它表示一個進程已經在運行?當進程存在時,當然,你必須刪除文件。這樣你可以防止產生新的進程。 –

+0

是讓它運行,因爲如果設備被移除並添加,它也會報警。它在終端中打印。它運行在後臺..如果我再次運行該程序,它不應該創建該程序的第二個實例.. – demic0de

回答

0

以下包裹下運行應用程序,而不是:

#!/bin/bash 

exist=`ps -e | grep udevmon | wc -l` 

if [ "$exist" == "0" ] ; then 
# there is no instance. run it 
    echo "first run" 
    ./udevmon -s 
else 
# kill old and run again 
    pid=`ps -e | grep udevmon | awk '{print $1;}'` 
    if [ "$pid" != "" ] ; then 
     kill $pid 
     echo "kill and run" 
     ./udevmon -s 
    else 
     echo "unable to find pid!" 
    fi 
fi 
+0

非常感謝你爲這個腳本它的作品如此之好,只是我在找什麼。我會開始學習bash腳本現在它是如此強大..順便說一句我可以在我的c代碼中添加此代碼,所以它也會運行,因爲我執行./udevmon ..我將使用系統(「killbaby.sh」) ;或者這是做這件事的正確方法?再次感謝。 – demic0de

+0

這是可以的。但請注意腳本在殺死舊版本後調用udevmon本身。如果您想在C/C++中調用killbaby.sh,請註釋掉運行udevmon的killbaby.sh行。這是因爲你的應用程序已經分叉並運行udevmon。所以劇本只需要殺死舊的劇本。 – ahmad

+0

你好,謝謝你,我有問題,我不知道在哪裏把系統(killbaby.sh);我應該把它放在主後面的頂部嗎?當我放置在主後,我終止了.. – demic0de