私は通過つもりだこの本マーク・ミッチェル、ジェフリー・オールダム、そしてアレックス・サミュエルことにより、高度なLinuxのプログラミング。2001年からですので、少し古いです。しかし、とにかくかなり良いと思います。
しかし、シェル出力でLinuxが生成するものとは異なる点に到達しました。92ページ(ビューアでは116ページ)の4.5 GNU / Linuxスレッド実装の章は、次の文を含む段落から始まります。
GNU / LinuxでのPOSIXスレッドの実装は、他の多くのUNIX系システムでのスレッド実装とは重要な点で異なります。GNU/ Linuxでは、スレッドはプロセスとして実装されます。
これは重要なポイントのようで、後でCコードで説明します。本の出力は次のとおりです。
main thread pid is 14608
child thread pid is 14610
そして、私のUbuntu 16.04では:
main thread pid is 3615
child thread pid is 3615
ps
出力はこれをサポートします。
2001年から現在までに何かが変わったに違いないと思います。
次のページの次のサブセクション4.5.1シグナル処理は、前のステートメントに基づいています。
シグナルとスレッド間の相互作用の動作は、UNIXに似たシステムごとに異なります。GNU / Linuxでは、スレッドはプロセスとして実装されるという事実によって動作が決定されます。
そして、これはこの本の後半でさらに重要になるようです。誰かがここで何が起こっているのか説明できますか?
私はこれを見ましたLinuxカーネルスレッドは本当にカーネルプロセスですか?、しかしそれはあまり役に立ちません。よくわかりません。
これはCコードです:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thread_function (void* arg)
{
fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
/* Spin forever. */
while (1);
return NULL;
}
int main ()
{
pthread_t thread;
fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
pthread_create (&thread, NULL, &thread_function, NULL);
/* Spin forever. */
while (1);
return 0;
}
getpid
はスレッドグループIDと呼ばれるものを返し、使用する必要のあるプロセスの一意のIDを取得しますgettid
。ただし、カーネル以外のほとんどの人とツールは、他のシステムとの一貫性のために、スレッドグループをプロセスと呼び、プロセスをスレッドと呼びます。