私はGoogleでこれら4つの違いを見つけようとしていたので、これについては膨大な量の情報があると予想していましたが、4つの呼び出しの間に明確な比較はありませんでした。
私は、これらのシステムコールの違いを一目で確認できるような種類のコンパイルを試みることに着手しました。これが私が得たものです。この情報はすべて正しいですか/重要な情報が欠けていますか?
Fork
:fork呼び出しは基本的に現在のプロセスの複製を作成し、ほぼすべての点で同一です(たとえば、一部の実装ではリソースの制限がすべてコピーされるわけではありませんが、できるだけ近いコピーを作成するという考えです)。
新しいプロセス(子)は別のプロセスID(PID)を取得し、古いプロセス(親)のPIDをその親PID(PPID)として持ちます。2つのプロセスがまったく同じコードを実行しているので、フォークの戻りコードによってどちらがどちらであるかがわかります。子は0を取得し、親は子のPIDを取得します。もちろん、これはすべてfork呼び出しが機能することを前提としています。機能しない場合、子は作成されず、親はエラーコードを受け取ります。
Vfork
:vforkとforkの基本的な違いは、vfork()で新しいプロセスが作成されると、親プロセスが一時的に中断され、子プロセスが親のアドレス空間を借用する可能性があることです。この奇妙な状況は、子プロセスが終了するか、execve()を呼び出すまで続き、その時点で親プロセスは続行します。
つまり、vfork()の子プロセスは、親プロセスの変数を予期せず変更しないように注意する必要があります。特に、子プロセスはvfork()呼び出しを含む関数から戻ってはならず、exit()を呼び出してはなりません(終了する必要がある場合は、_exit()を使用する必要があります);実際、これは子にも当てはまります。通常のfork()の場合)。
Exec :
exec呼び出しは、基本的に現在のプロセス全体を新しいプログラムに置き換える方法です。プログラムを現在のプロセス空間にロードし、エントリポイントから実行します。exec()は、現在のプロセスを、関数が指す実行可能ファイルで置き換えます。exec()エラーがない限り、制御が元のプログラムに戻ることはありません。
Clone :
クローンは、フォークとして、新しいプロセスを作成します。forkとは異なり、これらの呼び出しにより、子プロセスは、メモリスペース、ファイル記述子のテーブル、シグナルハンドラーのテーブルなど、その実行コンテキストの一部を呼び出しプロセスと共有できます。
子プロセスがcloneで作成されると、関数アプリケーションfn(arg)が実行されます。(これは、元のfork呼び出しのポイントから子で実行が継続されるforkとは異なります。)fn引数は、実行の開始時に子プロセスによって呼び出される関数へのポインターです。arg引数はfn関数に渡されます。
fn(arg)関数アプリケーションが戻ると、子プロセスは終了します。fnによって返される整数は、子プロセスの終了コードです。子プロセスは、exit(2)を呼び出すことによって、または致命的なシグナルを受信した後で、明示的に終了することもできます。
取得した情報:
- forkとexecの違い
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
これを読むために時間を割いてくれてありがとう!:)
fork()
それがLinuxであり、おそらくすべてのBSDで実装されている場合とは異なる方法で実装されている場合)、親のアドレス空間を借用しているため。execve()
または以外にも_exit()
、親が混乱する可能性が非常に高くなります。特に、exit()
呼び出し、atexit()
ハンドラやその他の「ファイナライザ」、例えば:それは標準入出力ストリームをフラッシュします。vfork()
子から戻ると、親のスタックが混乱する可能性があります(以前と同じ警告)。
fork
ますか、それともsyscall を呼び出すスレッドのみですか?