1

デバイスを検出して監視するデーモンプログラムであるこのアプリケーションがあります。引数を受け入れ、使用可能なデバイスを出力します。例えば

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

サンプル出力

 Device: /dev/ttyUSB0  subsystem: tty

もう一度実行して使用可能なデバイスを確認すると、./udevmon -sもう一度入力すると、異なるプロセスIDを持つ./udevmonの2番目のインスタンスが作成されます。引数なしで./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;       
}
4

1 に答える 1

0

代わりに、次のラップでアプリケーションを実行します。

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

次のスクリプトを使用して、上記と同じことをいくつかの通知で静かに強制終了できます。

#!/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
于 2012-09-28T05:54:18.713 に答える