こんにちは
ソフトな道を今日もほのぼのと歩きます。
今日は、前回「[Linux] スレッド内で使用していたメモリがSIGINTによって壊されていた為でした。」
で進展がありましたので以下記載します。
結論からいうと、
1.SIGINT処理ではprintf()は行ってはいけない
2. SIGINT処理で使用する変数型を変える
[変更前]
static int 型
[変更後]
#include <signal.h>
static volatile sig_atomic_t 型
3.ポインタで渡ってくるデータはローカル変数にコピーして使う。
です。
Segmentation fault
のエラーが3日目に発生していました。
調べたところ、SIGINT内にポインタで渡ってきたデータを
そのまま音声関連の関数の引数に渡していました。
SIGINTの関数を呼び出している上位のブラックボックスの処理で
何をしているかもわからない状況なので、
書き換わる可能性がありそうでした。
(上位側のプログラムでSIGINTの関数が別スレッドとして呼ばれていた場合は
私の知らないところでメモリが書き換わる可能性がある)
ですので、データをローカルな構造体に入れて、(メモリ確保している状態で)
上記の音声関連の関数に入れるようにしました。
今回、”3”を実装して連続運転を行しはじめました。
[今日のひとこと]
JAVAプログラミング能力認定試験 というものに興味が出てきました。
というのも、Android Studioにてアプリを仕事で作ったりしていたのですが、
(Kotlin言語です。)
そもそも、お作法が体系だって習っていないことに気付いた為です。
基本から実践へという流れではなく、
実践から基本にという流れですが、おさらいも含めて資格取得してみます。
3級、2級、1級とあるみたいですが、まずは3級からでしょうか。
0 件のコメント:
コメントを投稿