2017-05-12 2 views
2

Linuxで動作するCで簡単なデーモンを作成しました。信号マスクを正しく設定する方法を理解しようとしています。デーモンに次のコードがあります。Linux Cデーモンのシグナルマスクの設定

ここで、signal_handlerは定義済みの関数です。このthreadで説明されているデーモンの停止に問題があります。

異なる環境(同じユーザー、同じシステム)でデーモンを起動すると、ブロックマスクが異なるという問題を追跡しました。コマンドラインからデーモンを起動すると、次の「PS」の出力が得られます

> ps -C powid -o pid,ppid,command,blocked,caught,ignored 
PID PPID COMMAND        BLOCKED   CAUGHT  IGNORED 
11406  1 ./powid      0000000000390000 0000000180004003 0000000000000000 

をしてPHPスクリプトを経由して、まったく同じデーモンを起動するとき、利回り:ある理由

> ps -C powid -o pid,ppid,command,blocked,caught,ignored       
PID PPID COMMAND        BLOCKED   CAUGHT  IGNORED 
11491  1 ./powid      fffffffe3bfbe207 0000000180004003 00000000010010 

私の質問は、ブロックされたマスクは異なる。私の理解では、与えられたCコードはブロックされたマスクをすべての条件下で同じものにするでしょうか?

+0

あなたのPHPインタプリタがそうしているからです。 PHPを使用しないでください。 – 0andriy

+0

残念ながら、 – Marius

+0

私は知っている、PHPはプログラミング言語でも良い環境でもありません。それを選んだ人は故意にそれだった。だから、苦しんでいるのはバンドルの一部です。 – 0andriy

答えて

1

libc documentation状態:

各プロセスは、独自のシグナルマスクを有します。新しいプロセスを作成すると(プロセスの作成を参照)、そのプロセスはその親のマスクを継承します。だから、

両親は異なるマスクを持っていたので、別のブロックされたマスクがあるされている理由の答え...

あなたの与えられたCコードあなたとsigprocmaskを使用するため、ブロックリストにいくつかの信号を加算します最初のパラメータはSIG_BLOCKに設定されます。信号マスクを上書きする場合は、SIG_SETMASKを使用します。これで、親の独立したシグナルブロックマスクで終わるはずです。

+0

ありがとう、それは問題を解決しました。私は明らかにSIG_BLOCKとSIG_SETMASKの違いを理解していませんでしたが、ドキュメントは私のためにそれをクリアしました。答えをありがとう。 – Marius

関連する問題