こんにちは
ソフトな道をほのぼのと今日も歩きます。
今日は、前回「[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 件のコメント:
コメントを投稿