10

スレッドを作成するために Linux で pthread ライブラリを使用していますが、そのようなアプリケーションでのシグナル処理について 2 つの質問があります。

シグナル ハンドラーはプロセス全体に適用されることを知っています。つまり、プロセスにハンドラーを設定すると、すべてのスレッドがこのシグナル ハンドラーを持つことになります。またpthread_kill、特定のスレッドにシグナルを送信する機能があることも知っています。

kill私が理解している限り、たとえばシェルコマンドを使用してシグナルを送信することについて質問があります。たとえば、これを使用してプロセスにkill -INT PID送信します。 .SIGINTPID

最初の質問です。このシグナルがどのスレッドに配信されるかは保証できません。シグナル マスクにこのシグナルが含まれていない 1 つのスレッドにのみ配信されると確信できますか?

もしそうなら、「SIGFPE」、「SIGSEGV」などの特定のスレッドに配信されるいくつかのシグナルはどうkillですか?シェルコマンドを使用してそれらを送信すると、それらはランダムスレッドに配信されますか、それとも他のスレッドを作成したスレッドに配信されますか?

4

1 に答える 1

12

man pthreads の引用

POSIX.1 では、プロセス全体に向けられるシグナルと、個々のスレッドに向けられるシグナルの概念が区別されます。POSIX.1 によると、プロセス向けのシグナル (たとえば、kill(2) を使用して送信される) は、プロセス内で任意に選択された単一のスレッドによって処理される必要があります。

Linux には glibc 2.2 以前の時代にいくつかの問題がありました (linuxthreads は pthread の実装として使用されていました)。しかし、glibc 2.3-2.4 以降では、シグナルに関する POSIX 準拠においてより正確な NPTL があります。

シグナルマスクにこのシグナルがないと、1つのスレッドに配信されると確信できますか?

kill を使用している場合 - はい; このシグナルをブロックしないランダムなスレッドに。

もしそうなら、'SIGFPE'、'SIGSEGV'、

これらは、CPU/カーネルによって生成された場合にのみ、特定のスレッドに配信されます (コンテキスト内の特定の命令によって)。killPID 引数を持つユーティリティによるものではない

kill shell コマンドを使用してそれらを送信すると、それらはランダムなスレッドに配信されますか、それとも他のスレッドを作成したスレッドに配信されますか?

それらはプロセスのランダムなスレッドに配信され、通常 kill はプロセス全体のシグナルを送信します。しかし、シグナルが致命的である場合、プロセス中のすべてのスレッドが破棄されます。

PS: http://www.linuxprogrammingblog.com/all-about-linux-signals?page=11

于 2012-05-31T12:26:39.847 に答える