clone(2)は、主にスレッドの実装に使用されるLinux固有のシステムコールです(特に、に使用されます)。さまざまな引数を使用して、 fork(2)のような動作をすることもできます。直接使用する人はほとんどいません。pthreadライブラリを使用する方が移植性が高くなります。独自のスレッドライブラリ(Posixスレッドの競合)を実装している場合にのみ、syscallを直接呼び出す必要があります。これは非常に注意が必要です(特に、マシンで調整されたアセンブリコード化ルーチンでfutex(2) syscallを使用する必要があるためです。 、futex(7)を参照)。直接使用したくない、またはpthread_create
clone
clone
clone(2)
clone
futex
pthreadの方がはるかに簡単に使用できるためです。
(他のpthread関数では、 aのlibpthread.so
後に内部で簿記を行う必要があります)clone
pthread_create
Jonathonが答えたように、プロセスには独自のアドレス空間とファイル記述子セットがあります。また、プロセスはexecve syscallを使用して新しい実行可能プログラムを実行できます。このプログラムは、基本的にアドレススペース、スタック、および新しいプログラムを開始するためのレジスタを初期化します(ただし、ファイル記述子は、close-on-execフラグO_CLOEXEC
を使用しない限り、保持される場合があります。開く)。
Unixライクなシステムでは、すべてのinit
プロセス(通常、pid 1の最初のプロセスを除く)はfork
(または;のようなバリアントで作成されますが、のように動作するようvfork
に使用することはできますが、使用したくありません)。clone
fork
(技術的には、Linuxでは、無視できる奇妙な例外がいくつかあります。特に、カーネルプロセスまたはスレッド、およびカーネルによって開始されるまれなプロセスの開始など/sbin/hotplug
です。)
fork
およびexecve
syscallは、Unixプロセスの作成の中心です(waitpidおよび関連するsyscallを使用)。
マルチスレッドプロセスにはpthread_create
、すべて同じアドレス空間とファイル記述子を共有する複数のスレッド(通常はによって作成される)があります。同じアドレス空間内の同じデータを並行して処理する場合はスレッドを使用しますが、同期とロックに注意する必要があります。詳細については、pthreadチュートリアルをお読みください。
Advanced UnixProgrammingや(無料で入手可能な)AdvancedLinuxProgrammingのような優れたUnixプログラミングの本を読むことをお勧めします。