2016-09-09 5 views
0

Linuxオペレーティングシステムでデーモンとして動作するはずのCでサーバーを作っています。私もロギングシステムを持っており、私はUARTの読書をします。私はどこかで、デーモンの実行中にSIGHUPを使用して設定ファイルを読み直し、いくつかの値を更新することができます。私の質問は、どのようにこれは、彼らが最初と同じように(例えば、私がシリアルポートから読んでいる場合、それらを持っている必要があります操作の途中で値を変更する潜在的な危険なしで行う必要があります、パッケージを受け取る途中で私のBAUDを変更したくない)。 ロックが気になりましたが、実際にプログラムを変更して、関数を入力する前/後に値を変更する必要があるかどうかを確認する必要はありません。Linuxサーバー構成で信号を使用して再読

編集: シグナルハンドリングの意味で機能をアトミックにする方法がある場合(シグナルハンドラは、これらの関数が進行する前に終了するのを待つ)、これも私の問題を解決します。

答えて

1

信号を受信すると、シグナルハンドラ内で設定されるグローバル*ブール変数を定義します。

次に、設定ファイルを再読み込みして必要なものを再初期化することが安全なメインループのポイントを特定します。その時点で、前記ブール変数(および他のブロッキング条件)の値を分析してアクションを実行します。そのフラグ変数をクリアして、次の繰り返しですべてを再初期化しないようにしてください。


*グローバルは、シグナルハンドラとメインループの両方に表示されます

+0

ロックが心に浮かんできましたが、実際にはプログラムを変更してインジケータ関数を入力する前後に値を変更する必要がある場合。たぶん私は間違った表現 "ロック"を使用しました。固定小数点はより良いオプションですので、上記の意味では1つの反復がアトミックです。それは私が知る限りそれを行う方法ですが、何か違うものがあれば、私は別のものを探していました。 – NMilev

+0

あなたは何を探していますか?シグナルハンドラ内から変更を適用するのが安全かどうかを判断する汎用的な方法については?私はそのような方法が存在するのか疑問です。 – Serge

+0

私は、これらの状況で使用される原則であるCに何かがあるかもしれないと考えていました。私はそれについてもっと考えるほど、それは非論理的であるように見えます。良い答えをありがとう。 – NMilev

関連する問題