2020年7月3日金曜日

[Linux] スレッド内で使用していたメモリがSIGINTによって壊されていた為でした

こんにちは


ソフトな道をほのぼのと今日も歩きます。


今日は、前回「[Linux] Watchdog タイマリスタートのタイミングによってアプリハング」


で進展がありましたので以下記載します。


結論からいうと、


スレッド内で一時的に使用する配列や変数はstaticをつけて

メモリを保護しましょう。


です。


期待していた動作と実際の動作は以下でした。


[期待していた動作]  

    1. main 処理 ループ

    2. gpio処理のスレッド発生

    3. gpio処理のスレッド開始

        char open_path[100];

        …

        sprintf(open_path, "/sys/class/gpio/gpio%d/value", 111);

    4. SIGINT 発生

    5. SIGINT処理 開始

    6. SIGINT処理 終了

    7. gpio処理のスレッド続き

        *fd = open(open_path, O_RDONLY| O_CLOEXEC);

        …

    8. gpio処理のスレッド終了

    9. main処理 ループ


[実際の動作]

    1. main 処理 ループ

    2. gpio処理のスレッド発生

    3. gpio処理のスレッド開始

        char open_path[100];

        …

        sprintf(open_path, "/sys/class/gpio/gpio%d/value", 111);

    4. SIGINT 発生

    5. SIGINT処理 開始

    6. SIGINT処理 終了

    7. gpio処理のスレッド続き

        *fd = open(open_path, O_RDONLY| O_CLOEXEC);

        open_pathが壊れている為ハング!!


期待した動作にするには

メモリを確保しておくと良さそうです。


    3. gpio処理のスレッド開始

        static char open_path[100];

        …

        sprintf(open_path, "/sys/class/gpio/gpio%d/value", 111);

    7. gpio処理のスレッド続き

        *fd = open(open_path, O_RDONLY| O_CLOEXEC);

        open_pathは保護されるので別プロセスで変更されることはありません!!



0 件のコメント:

コメントを投稿