2012-03-14 1 views
3
  1. プロセス間通信には(SIGRTMIN + 1)が安全ですか?異なるプロセスで変化しますか?Linuxシグナルに関するいくつかの質問

  2. sigqueue(2)またはkill(2)を使用して標準信号とリアルタイム信号を送信する場合、違いはありますか?
    SIGUSR1(標準信号)シリーズを送信してゆっくり処理する場合は、SIGUSR1という複数のインスタンスがキューにありますか?sigqueue(2)
    kill(2)SIGRTMIN(リアルタイム信号)に送信することはどうですか?それらは待ち行列に入れられますか?

答えて

3

sigqueue()は、リアルタイム信号のみを送信するのに使用でき、kill()は標準信号のみを送信するために使用できます。私はいずれかのAPIで間違った信号を送信しようとしていません。しかし、私はそれがいくつかの適切なerrnoで失敗すると期待します。 Linuxは標準シグナルを待ち行列に入れません。リアルタイム信号はキューに入れられます。キューに入れることができるリアルタイム信号の最大数はと定義されています。RLIMIT_SIGPENDING

特定の信号送信者が送信しているハンドラの設定がある限り、リアルタイム信号を使用できます。私は、以前の私の答えで間違っていた

EDIT

。 kill()もリアルタイム信号を送ることができるようです。しかし、__send_signal()のコメントから、リアルタイムシグナルを送信するためにkillを使うと、シグナルが待ち行列に入れられないことがあるような場合があります。

/* 
    * Real-time signals must be queued if sent by sigqueue, or 
    * some other real-time mechanism. It is implementation 
    * defined whether kill() does so. We attempt to do so, on 
    * the principle of least surprise, but since kill is not 
    * allowed to fail with EAGAIN when low on memory we just 
    * make sure at least one signal gets delivered and don't 
    * pass on the info struct. 
    */ 
+0

カーネルのソースコードを読んだり、Posixの仕様を読んだら、それは経験ですか?いくつかのソースがある場合、それらを共有するのは興味深いでしょう... –

+1

しかし、事実は 'kill(2)'と 'sigqueue(2)'はどちらも失敗することなくシグナルを送ることができます。私は彼らが働くことを証明するために小さなテストを書いた。しかし、コメントにソースコードを投稿する方法はわかりません。 – majie

0

この投稿は古いニュースですが、それはいくつかの明確化されているGoogleで上位にランクインし、残念ながらそう、ここで誤解されています

  1. 一つは、このとき、sigqueueが可能
  2. 、これらの機能のいずれかで任意の信号を送ることができますいくつかの "文脈" [例えば、情報、@see siginfoなど。 al]、kill/raiseとは対照的に
  3. リアルタイム信号によると、送信またはキューイングされても問題ありません。キューされたcf。非RTシグナルと同じようにグループ化]
関連する問題