私は比較的新しいプログラミング言語です。 fork()
の後にexec()
関数が呼び出されて親プロセスでデータが失われる可能性があるのだろうかと思います。fork()の後にexec()が呼び出されると、既存のプロセスでデータが失われる
答えて
fork
への呼び出しが成功すると、呼び出しプロセスの複製である新しいプロセスが作成されます。複製されることの1つはファイル記述子なので、新しいプロセスが元のプロセスと同じファイル記述子を読み書きすることは可能です。
exec
機能は、現在のプロセスで現在実行中のプログラムを新しいプログラムで置き換え、そのプロセスで古いプログラムのメモリを上書きします。したがって、古いプログラムのメモリに格納されているデータはすべて失われます。ただし、このプロセスをフォークした親プロセスには影響しません。
exec
で新しいプログラムを実行すると、FD_CLOEXEC
(exec-on-close)フラグが設定されていない開いているファイルディスクリプタ(fcntl
man page参照)が再び保持されます。これで2つのプロセスがあり、それぞれが異なるプログラムを実行している可能性があります。どちらも同じファイル記述子に書き込むことができます。そのような状況が発生し、プロセスが適切に同期しない場合、あるプロセスによってファイルに書き込まれたデータは、他のプロセスによって上書きされる可能性があります。
したがって、子プロセスが親プロセスから継承したファイル記述子への書き込みに関して、データが失われる可能性があります。
*新しいプログラムがexecによって実行されると、開いているファイル記述子が再び保存されます。*一般的にはそうです。しかし、['FD_CLOEXEC'フラグがセットされたファイル記述子は' exec * '呼び出しで閉じます(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/fcntl.h.html):" 'FD_CLOEXEC' Close * exec *ファミリ機能の実行時のファイル記述子 " –
@AndrewHenleそれを持ってきてくれてありがとう。私は答えにその詳細を含めました。 – dbush
- 1. fork()の呼び出し後に余分なデータが出力される
- 2. jconfirmが呼び出されたときにチェックボックスの値が失われる
- 3. PHPから呼び出されたときにcURLが失敗するexec()
- 4. コアレスでkubernetesからrbd(docker)を呼び出すとfork/execの無効な引数が返される
- 5. forkとexecで配管した後で出力が表示されない
- 6. OpenCL:バリアブル呼び出しの後に__local配列の値が失われる
- 7. アップデート後にiOSアプリの保存データが失われる
- 8. exec()はfork()で何回呼び出すことができますか
- 9. 変数が呼び出されるときにプロセスを実行
- 10. fork()とexec()2つの子プロセス
- 11. CakePHP:プラグインからアクションを呼び出した後にセッションが失われる
- 12. createUserWithEmailAndPassword(email、password)を呼び出した直後にインターネット接続が失われる
- 13. C++ - 関数呼び出しでプログラムが失われる
- 14. AWS RDS - dbインスタンスクラスをダウングレードすると、既存のデータが失われますか?
- 15. execvを呼び出すとstdin to parentプロセスがブロックされる
- 16. 他のドメインのcoideigniterでajaxを呼び出すとセッションが失われる
- 17. openpyxlでExcelの既存のDataValidationが失われる
- 18. コントローラが呼び出された後にhtml.erbファイルが呼び出されるのはなぜですか?
- 19. lua_pcallで呼び出されたlua関数のエラーメッセージが失われました
- 20. OSで新しいプロセスを作成するのにfork + execが使用されるのはなぜですか?
- 21. dbSetです.dbSetが呼び出された後に呼び出されると無意味ですか?
- 22. 作成するプロセス数fork()exec()
- 23. ORDER BYのデータと条件が呼び出されるたびにクエリ内で
- 24. php - base64でエンコードされたデータがjson_encodeの後に失われる
- 25. onDestroy()が呼び出された後でもアクティビティインスタンスが存在する
- 26. onReceiveが呼び出されないときに呼び出される
- 27. Xamarin iOS:バックグラウンドフェッチで呼び出された有効期限切れのハンドラが呼び出されたときに最後に呼び出されます
- 28. C子プロセスでexecによって呼び出されたプロセスのstdoutをファイルにリダイレクト
- 29. gcが呼び出された後、
- 30. MP3量子化プロセス中にデータが失われる
どちらですか? 'fork()'の後に2つのプロセスがあります。 –
親プロセスでデータ損失が0になります(ファイル記述子の共有を継続することを除いて、子プロセスでデータが失われることはありません)。エグゼクティブが成功した場合は子プロセスで100%のデータ損失が発生します...... –
ここにはきれいな説明があります[https://stackoverflow.com/questions/1653340/differences-between-fork-and-exec ) –