2017-08-08 11 views
1

私は比較的新しいプログラミング言語です。 fork()の後にexec()関数が呼び出されて親プロセスでデータが失われる可能性があるのだろうかと思います。fork()の後にexec()が呼び出されると、既存のプロセスでデータが失われる

+0

どちらですか? 'fork()'の後に2つのプロセスがあります。 –

+2

親プロセスでデータ損失が0になります(ファイル記述子の共有を継続することを除いて、子プロセスでデータが失われることはありません)。エグゼクティブが成功した場合は子プロセスで100%のデータ損失が発生します...... –

+0

ここにはきれいな説明があります[https://stackoverflow.com/questions/1653340/differences-between-fork-and-exec ) –

答えて

6

forkへの呼び出しが成功すると、呼び出しプロセスの複製である新しいプロセスが作成されます。複製されることの1つはファイル記述子なので、新しいプロセスが元のプロセスと同じファイル記述子を読み書きすることは可能です。

exec機能は、現在のプロセスで現在実行中のプログラムを新しいプログラムで置き換え、そのプロセスで古いプログラムのメモリを上書きします。したがって、古いプログラムのメモリに格納されているデータはすべて失われます。ただし、このプロセスをフォークした親プロセスには影響しません。

execで新しいプログラムを実行すると、FD_CLOEXEC(exec-on-close)フラグが設定されていない開いているファイルディスクリプタ(fcntl man page参照)が再び保持されます。これで2つのプロセスがあり、それぞれが異なるプログラムを実行している可能性があります。どちらも同じファイル記述子に書き込むことができます。そのような状況が発生し、プロセスが適切に同期しない場合、あるプロセスによってファイルに書き込まれたデータは、他のプロセスによって上書きされる可能性があります。

したがって、子プロセスが親プロセスから継承したファイル記述子への書き込みに関して、データが失われる可能性があります。

+1

*新しいプログラムがexecによって実行されると、開いているファイル記述子が再び保存されます。*一般的にはそうです。しかし、['FD_CLOEXEC'フラグがセットされたファイル記述子は' exec * '呼び出しで閉じます(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/fcntl.h.html):" 'FD_CLOEXEC' Close * exec *ファミリ機能の実行時のファイル記述子 " –

+0

@AndrewHenleそれを持ってきてくれてありがとう。私は答えにその詳細を含めました。 – dbush

関連する問題