2016-09-20 6 views
2

fork()を使用して子プロセスを作成すると、その子は親の複製となります。ポインタが各プロセスで同じものを指すか、ポインタが子プロセス内で新しい値をとるか配列やファイルポインタはどうですか? fork(2) man page(強調鉱山)からfork()はエイリアスを作成しますか?

+0

子のポインタは、親のポインタと同じアドレスを保持します。そのアドレスが指すアドレスは、子と親の両方に同じデータを保持します。プロセスの1つがその値に書き込むと、そのプロセスでは異なりますが、別のプロセスでは異なります。 1つのプロセスがFILE *から読み込むと、そのFILE *の内部コピーが更新されます(ファイル内のその位置など)が、他のプロセスでは更新されません。しかし、基礎となるファイル記述子を変更したものは、両方のプロセスで見られます。 –

+0

ポインタは同じ値を指しますが、同じ値の2つの異なるコピーを指していますか?これは私が興味をそそられていることであり、あなたのコメントを読んでいるとき、それはあなたが言っていることですか? –

+0

ポインタは*同じ値を持ち、各プロセスで返された瞬間の 'fork()'と同じ*を指していました。それ以降は、プロセスごとに何が起こりますか?そのアドレススペースは区別されます。 – EJP

答えて

3

ポインタは、各プロセスで同じものを指していますか?

はい、すべてのメモリがポインタを含めてコピーされます。

配列またはファイルポインタはどうですか?

はい。ファイル記述子の場合、親で開いているファイル記述子はすべて、子プロセス内の同じファイルを参照することに注意することは有益です。


ほとんど(全て?)のUnixシステムでは、これらのいずれかがメモリを書き込むまでのプロセスは、実際の物理メモリを共有することを意味し、コピー・オン・ライト最適化のいくつかのフォームを使用します。これはfork()を非常に安価な操作にする傾向があります。

Vazquez-Abramsのようにコーナーケースがあります。おそらく最も重要なのは、fork()システムコールを呼び出すスレッドが1つだけforkされるということです。

0

新しいプロセス、子と呼ばれるが、は正確な呼び出し元プロセスのを複製され、以下を除いて、親、と呼ばポイント

* この子は独自のプロセスIDを持ち、このPIDは既存のプロセスグループ(setpgid(2))のIDと一致しません。

* 子の親プロセスIDは、親のプロセスIDと同じです。

* 子は親のメモリロック(mlock(2)、mlockall(2))を継承しません。

* プロセスリソースの利用率(getrusage(2))とCPU時間カウンタ(times(2))は、子プロセスでゼロにリセットされます。

* 子供の保留信号のセットは、最初は空です(sigpending(2))。

* 子は、親(semop(2))からのセマフォ調整を継承しません。

* 子は親からのレコードロックを継承しません(fcntl(2))。

* 子は、親(setitimer(2)、alarm(2)、timer_create(2))からタイマーを継承しません。

* 子は親(aio_read(3)、aio_write(3))から未処理の非同期I/O操作を継承しません。また、(2 io_setupを参照してください(親からの任意の非同期I/Oコンテキストを継承しません))。

上記のリストのプロセス属性はすべてPOSIX.1-2001で指定されています。

* 子は親からディレクトリ変更通知(dnotify)を継承しません(fcntl(2)のF_NOTIFYの説明を参照)。

* prctl(2)PR_SET_PDEATHSIG設定は、親が終了したときに子が信号を受信しないようにリセットされます。

* デフォルトのタイマースラック値は、親の現在のタイマースラック値に設定されます。 prctl(2)のPR_SET_TIMERSLACKの説明を参照してください。

* madvise(2)MADV_DONTFORKフラグでマークされているメモリマッピングは、fork()で継承されません。

* 子の終了信号は常にSIGCHLDです(clone(2)を参照)。

* ioperm(2)で設定されたポートアクセス許可ビットは、子に継承されません。子供はioperm(2)を使用して必要なビットをオンにする必要があります。

注以下のさらなる点:

*子プロセスは、単一スレッドを使用して作成された - フォークと呼ばれるもの()。親の仮想アドレス空間全体は、mutex、条件変数、およびその他のpthreadオブジェクトの状態を含む、子に複製されます。 pthread_atfork(3)の使用は、これが引き起こす可能性がある問題に対処するのに役立ちます。

* 子は親のオープンファイル記述子のセットのコピーを継承します。子の各ファイル記述子は、親の対応するファイル記述子と同じオープンファイル記述子(open(2)を参照)を参照します。これは、2つのディスクリプタがオープンファイルステータスフラグ、現在のファイルオフセット、および信号駆動I/O属性を共有していることを意味します(fcntl(2)のF_SETOWNおよびF_SETSIGの説明を参照)。

* 子は親のオープンメッセージキュー記述子のセットのコピーを継承します(mq_overview(7)を参照)。子の各記述子は、親の対応する記述子と同じオープンメッセージキュー記述を参照します。これは、2つの記述子が同じフラグ(mq_flags)を共有していることを意味します。

* 子は親のオープンディレクトリストリームのセット(opendir(3)を参照)のコピーを継承します。 POSIX.1-2001は、親と子の対応するディレクトリストリームがディレクトリストリームの位置を共有するかもしれないと述べている。 Linux/glibcではそうではありません。

+2

私はまっすぐmanページに行きましたが、解読するのはちょっと難しいです。 –

+0

"子は、親の対応するファイル記述子と同じオープンファイル記述子(open(2)を参照)を参照します。つまり、2つの記述子現在のファイルオフセット、および信号駆動I/O属性を共有します(fcntl(2)のF_SETOWNおよびF_SETSIGの説明を参照)。 –

関連する問題