問題タブ [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.
unix - sigprocmask() を使用した sigset_t unix
printf を使用して sigset を印刷しようとしています。このプログラムでは、sigprocmask を使用して SIGHUP と SIGTERM をブロックしました。set と oset を空のセットに初期化した後、出力としてランダムな 16 進文字列が返されます。この問題を解決するにはどうすればよいですか??
また、実行後に Ctrl-C を押すと、このプログラムの期待される出力について疑問があります。キャッチャー関数も現在のシグナル セットを継承し、セットと同じものを出力する必要がありますか??
c - 2 つのプロセス間のシーケンシャル シグナル
親プロセスと 2 人の子供がいます。親プロセスは、リーダーとカウンターの 2 つの子のみを作成し、その終了を待ちます。子どもたちは次のことを行います。
最初の子 (リーダー):
- ファイルを開き、
- 一行読み、
- シグナル (SIGUSR1) を 2 番目の子に送信し、
- 2 番目の子からのシグナルを待ち、
- 次の行が読める場合は 2 に進み、そうでない場合は 2 番目の子を殺します。
2 番目の子 (カウンター):
- リーダーからのシグナル (SIGUSR1) を待ちます。
- 行の長さをカウントし、
- リーダーにシグナルを送信し、1 に移動します。
別のプロセスからのシグナルを待つのに問題があります。関数を呼び出す前にシグナルを受信できますpause()
。つまり、プロセスを永久にブロックできます。sigprocmask()
、 、sigsuspend()
も使用しようとしましsigwaitinfo()
たが、正しく動作しません。
このコードでは、次のシーケンスを取得できます。
なぜカウンターは「信号を得た」と書かないのですか? シグナルを同期的に送受信するにはどうすればよいですか? (他の IPC メソッドについては知っていますが、シグナルによる同期が必要です。)
linux - sigtimedwait() の「set」パラメーターのシグナルが配信されない
私は最近、Linux でのシグナル処理に取り組んでおり、シグナル処理に関連するすべての概念を読みました。私の頭を悩ませている 1 つの質問は、プロセスのブロックが解除されている間、sigtimedwait() のセットのシグナルが配信されない理由です。私のコードは次のとおりです:-
質問をより明確にするために、上記のコードで「set」パラメーターとして「s1」を使用して sigtimedwait を呼び出しました。このセットには、シグナル SIGINT のみが含まれます。man ページによると、sigtimedwait() は、セット内のシグナルの 1 つが配信されるまでプロセスをブロックします。私はその声明で大丈夫です。しかし、プロセスのブロックを解除するために SIGINT を渡すと、SIGINT ハンドラが呼び出されないのはなぜですか? 一方、セットにない SIGALRM または SIGTSTP を渡すと、期待どおりに EINTR が返され、シグナル ハンドラも呼び出されます。
シナリオを観察したい人は、上記のコードを実行して SIGINT を渡すことができます。彼らは、ハンドラが呼び出されなくてもプロセスがブロックされていないことを確認します。ハンドラーが呼び出されないのはなぜですか? sigtimedwait()の man ページの一部を誤解していますか??
c - ここで信号が使用される方法の背後にある考え方は何ですか?
シグナルについて読んで学習しているときに、特定の方法でシグナルを使用するプログラムを見つけました。私はそれを理解しようとしましたが、コードのすべての部分が他の部分とどのように相互作用するかはわかりません。
以下は上記のコードで、問題がある箇所にコメントを追加しました。
明らかに、上記のプログラムは、最大 42 個の子プロセスが動作するように意図されています。新しい子プロセスが必要なときはいつでも fork を使用し、調整しcurprocs
ます。子プロセスが終了するたびに、chldhandler() が呼び出されcurprocs
、同様に調整されます。
sigproc_mask, sigsuspend, waitpid
しかし、私は 2 つと私たちの 2 つの相互作用を理解していませんsignalsets chld, empty
。
これらの行が何をするのか、またはなぜこのように使用されるのかを誰か説明できますか?