2020年7月18日土曜日

[Linux] SIGINTによってメモリ破壊をしていた箇所は意外にも3

こんにちは


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


今日は、前回「[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 件のコメント:

コメントを投稿