問題タブ [sigprocmask]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
32367 参照

c - sigprocmask() の Set と Oldset

の使い方がよくわかりませんsigprocmask()。特に、setandoldsetとその構文がどのように機能し、どのように使用するかについて説明します。

例を挙げて説明してください。ブロックするには、SIGUSR1 を数秒間言ってから、ブロックを解除して処理します。

0 投票する
1 に答える
489 参照

linux - sigprocmask() causing segfault

Are there any well known reasons for sigprocmask() to segfault when used in a multithreaded application?

I have an application that creates multiple threads using clone(). I have determined that for some reason when I use sigprocmask it segfaults (not all the time though). From the backtrace() it also seems like the segfault is occuring when I use sigprocmask() after a siglongjmp().

Any ideas?

0 投票する
1 に答える
915 参照

linux - sigprocmaskが機能しない

私は次のようにsigprocmaskを使用しています:

驚いたことに、大きなリストを出力する関数は、最初にmask()を呼び出したとしても、シグナルによって何らかの形で中断されます。私の関数は他の関数を呼び出さないため、マスクが失敗したように見えます。したがって、実行中にunmask()が発生することはありません。sigprocmaskが失敗する原因は何ですか?

0 投票する
2 に答える
26264 参照

c - UNIX でシグナルをブロックする sigprocmask( )

私は小さなコードを書きました。このコードは、最初に {SIGSEGV} をブロックし、次に SIGRTMIN を同じセットに追加します。最終的なシグナル セットは {SIGSEGV,SIGRTMIN} です。したがって、SIG_UNBLOCK を使用する場合、私の理解では、最初に SIGRTMIN のブロックを解除し、次に SIG_UNBLOCK を呼び出すと、SIGSEGV のブロックを解除する必要があります。

つまり、1) {SIGSEGV,SIGRTMIN} 2) SIG_UNBLOCK = SIGRTMIN のブロックを解除します。3) SIG_UNBLOCK を再度呼び出します = SIGSEGV のブロックを解除します。プロセスに SIGRTMIN のみを与えているため、2 回目のブロック解除は SIGRTMIN でプロセスを停止する必要があります。そうではありません。助けてください。 注意: sigprocmask( ) に関する他の質問の回答へのリンクを提供しないでください。私はそれらを見ましたが、私の質問を明確にしていません。

}

0 投票する
1 に答える
359 参照

linux - sigprocmask により、メイン プロセスが停止する

sigprocmask fn を使用するマルチスレッド コードがあります。この呼び出しの使用は、マルチスレッド プログラムでは指定されていないことがわかっているので、この呼び出しを削除します。ただし、私が直面している問題は、この関数が呼び出されるとメイン スレッドが停止することです。なぜこれが起こるのか理解したい。この関数の呼び出しがコメント化されている場合、メイン スレッドは正常に実行されます。

Init 中の私のメイン プログラムでは、いくつかのスレッド プールが作成されます。その後、InitModule fn が呼び出される TestFunction 関数を呼び出します。InitModule では、sigprocmask が呼び出され、その他の初期化が行われます。その後、関数は TestFunction に戻ります。これが行き詰まるところです。

使い方は以下の通り

InitModule から sigprocmask() 呼び出しを削除すると、"DoSomethingElse done" が出力されます。sigprocmask を使用するとスレッドがスタックするのはなぜですか?

この fn を呼び出した後の InitModule の残りのコードは常に実行されることに注意してください。呼び出し元の関数に戻ったときにのみ、スタックします。

0 投票する
2 に答える
2323 参照

c++ - シグナル実行中の sigprocmask

私は現在、コードの重要なセグメントが実行されているときにsigprocmask特定のシグナル (この場合はSIGALRMと) をブロックするために を使用することを研究しています。SIGCHLDこれらのシグナルに関連付けられた両方のシグナル ハンドラーは、中央のデータ構造にアクセスして変更するため、メイン プロセスが処理している間は、これらのシグナル ハンドラーがデータ構造にアクセスできないようにすることが重要です。

現時点では、コードのクリティカル セクションの開始時にこれらのシグナルを単純に無効にし、最後に再度有効にする予定です。

ただし、ブロックされるシグナルのシグナルハンドラも を呼び出しますcriticalFunctionsigprocmask関数を呼び出して独自のシグナルでブロッキングを有効にするとどうなるでしょうか? それらは停止しますか、それとも実行を続けますか? (またはいくつかの 3 番目の条件..)

これについて私が見つけることができた唯一のメモは次のとおりです。

sigprocmask() がシグナルハンドラーで呼び出された場合、ハンドラーから戻ると、元の保留中のシグナルマスクを復元することにより、sigprocmask() の作業が取り消される場合があります。( http://www.mkssoftware.com/docs/man3/sigprocmask.3.asp )

(これは私の前の質問へのフォローアップの質問です:キューのデータ構造にアクセスするシグナルハンドラー (競合状態?) )

0 投票する
1 に答える
8991 参照

c - Cでシグナルをブロックするには?

シグナル SIGUSR1 をブロックし、シグナルのブロックを解除するプログラムを作成しようとしています。途中で、 ​​を使用して信号がブロックされていることを確認したいと思いsigpendingます。しかし、信号はブロックされていないと常に表示され、ブロックされているはずの信号を使用できます。これは私が持っているコードです。

誰でも私を助けることができますか?

0 投票する
1 に答える
852 参照

c - OS X sigaction が sa_mask を誤って設定する

Macbook (OSX 10.9.5 (13F34)) では、次の簡単なプログラム:

不思議なことに次のように表示されます:

sa_maskのメンバーが で与えられたosaように一致することを期待します。masksigprocmask

POSIX はこのフィールドの要件を指定していますか? SIGKILLマンページでの唯一の言及は、その値が指定されていないのようなブロックできないシグナルに関するものです。

Linux では、このプログラムは以下を出力します。

予想通り。

gcc のバージョンは次のとおりです。

バイナリは以下に対してリンクされています。

0 投票する
1 に答える
1653 参照

unix - sigprocmask() を使用した sigset_t unix

printf を使用して sigset を印刷しようとしています。このプログラムでは、sigprocmask を使用して SIGHUP と SIGTERM をブロックしました。set と oset を空のセットに初期化した後、出力としてランダムな 16 進文字列が返されます。この問題を解決するにはどうすればよいですか??

また、実行後に Ctrl-C を押すと、このプログラムの期待される出力について疑問があります。キャッチャー関数も現在のシグナル セットを継承し、セットと同じものを出力する必要がありますか??

0 投票する
1 に答える
391 参照

c - 2 つのプロセス間のシーケンシャル シグナル

親プロセスと 2 人の子供がいます。親プロセスは、リーダーとカウンターの 2 つの子のみを作成し、その終了を待ちます。子どもたちは次のことを行います。

最初の子 (リーダー):

  1. ファイルを開き、
  2. 一行読み、
  3. シグナル (SIGUSR1) を 2 番目の子に送信し、
  4. 2 番目の子からのシグナルを待ち、
  5. 次の行が読める場合は 2 に進み、そうでない場合は 2 番目の子を殺します。

2 番目の子 (カウンター):

  1. リーダーからのシグナル (SIGUSR1) を待ちます。
  2. 行の長さをカウントし、
  3. リーダーにシグナルを送信し、1 に移動します。

別のプロセスからのシグナルを待つのに問題があります。関数を呼び出す前にシグナルを受信できますpause()。つまり、プロセスを永久にブロックできます。sigprocmask()、 、sigsuspend()も使用しようとしましsigwaitinfo()たが、正しく動作しません。

このコードでは、次のシーケンスを取得できます。

なぜカウンターは「信号を得た」と書かないのですか? シグナルを同期的に送受信するにはどうすればよいですか? (他の IPC メソッドについては知っていますが、シグナルによる同期が必要です。)