1

職場で、Linux で C++ を使用して産業用ハードウェア用の新しいコントローラー アプリケーションを実装するように依頼されました。主な機能は、modbus を使用したデバイス間の無線モデム通信の使用です。シリアル ポート ttyS0 へのデータの読み取りと書き込みは問題なく実行できますが、SIGIO シグナルのシグナル ハンドラを使用して、読み取り用のポートにデータが到着したことをメイン制御ループに通知しています。プロトコルは送信の終了を 3.5 文字の長さとして定義しているため、タイミングが重要です。これを検出する必要があります。SIGIO ハンドラーを使用することは、この目的には適していないことを Web で見ました (これに対する回答は、こちらの stackoverflowを含めてください)。このアプローチが嫌われている理由を誰か教えてください。私の好みは、poll()またはを使用して新しいスレッドで受信メッセージの監視を実行することですselect()私の上司はシグナルハンドラのアプローチに熱心ですが、私たちはどちらも Linux を初めて使用するので、どんな説明でも喜んで受け取ります。

4

1 に答える 1

1

シグナル ハンドラーは、再入可能性とアトミック性に関連する複雑さとバグのリスクを大幅に追加します。ここでディスカッション記事を見ることができます: http://www.ibm.com/developerworks/linux/library/l-reent/index.html

ユースケースにシグナルハンドラーを使用する正当な理由があるようには思えません。シグナル ハンドラーが別のスレッドに読み取りを実行するように通知するだけの場合、ブロッキング読み取りを使用したり、その別のスレッドから選択したりしないのはなぜでしょうか?

于 2012-05-29T18:45:32.947 に答える