33

実行中に実行可能ファイルを再コンパイルするとどうなりますか?オペレーティングシステムは、実行可能ファイルの実行を開始するときに、実行可能ファイルのすべての内容をメモリに読み込むので、新しい実行可能ファイルを読み取ることはありませんか?または、変更されていないと考えて新しい実行可能ファイルのセクションを読み取り、未定義の動作を引き起こす可能性がありますか?

ループ内で実行可能ファイルを繰り返し呼び出すスクリプトを実行していて、スクリプトの実行中に実行可能ファイルを再コンパイルするとどうなりますか。ループの将来の反復で新しい実行可能ファイルが呼び出され、切り替えが行われたときに進行中だった呼び出しの結果のみが破損する可能性があることが保証されていますか?

私のOSはLinuxですが、Windowsで何が起こるかについても興味があります。

4

8 に答える 8

36

これは実行可能ファイルを書き出す従来のコンパイラなので、Linuxでそれに従いましょう。

最初に知っておくべきことは、Linuxファイル名はファイルを直接参照するのではなく、ファイル名に依存しないディレクトリエントリを参照するということです。ファイルには実際にはファイル名が必要ではありませんが、そうでない場合は参照するのが困難になります。

プロセスがファイルを使用していて、そのファイルを置換または削除した場合、プロセスはディレクトリエントリを介してそのファイルを引き続き使用します。ファイルを使用する、またはファイルを検索する新しいプロセスは、新しいバージョンを取得するか(置き換えた場合)、またはファイルを見つけることができません(削除した場合)。すべてのプロセスが古いファイルで完了すると、ファイルシステムから削除されます。

したがって、同じ名前の新しい実行可能ファイルを再コンパイルして作成しても、実行中のプロセスに影響はありません。古い実行可能ファイルを引き続き使用します。ファイルを開こうとする新しいプロセスはすべて、新しいプロセスを取得します。ループに入っている場合はsystem("foo");、実行するたびに、ファイル名fooがその時点で何を意味するかがわかります。

Windowsはファイルの処理方法が異なります。一般に、ファイルを使用するプロセスがある場合、ファイルはロックされており、削除または置換できない場合があります。

于 2010-07-28T19:43:59.020 に答える
8

場合によります。

OSが実行可能ファイル全体をメモリに読み込み、ディスクイメージを参照しない場合は、「使用中」のときに再コンパイルできます。

実際には、これは常に発生するとは限りません。OSが実行可能ファイルでファイルハンドルを開いたままにしておくと(Windowsのように)、ファイルが削除されたり上書きされたりするのを防ぐことができます。

Linux / Unixでは、「使用中」のファイルを上書きすることができます。詳細な説明については、DavidThornleyの回答を参照してください。

于 2010-07-28T19:11:58.790 に答える
7

Windowsでは、ロックされたファイルを削除することはできませんが、ほとんどの人が知らないのは、実行中のexeファイルを移動または名前変更できることです。

だからあなたは

  • 古いexeファイルを同じドライブの一時ディレクトリに移動します
  • 次の再起動時に削除するようにスケジュールします。MoveFileEx(name、NULL、MOVEFILE_DELAY_UNTIL_REBOOT);
  • その場所に新しいexeを移動します。

古いプログラムは実行を続けますが、新しいプロセスは新しいファイルを使用します。

于 2010-07-28T20:16:20.830 に答える
6

Linuxでは、実行可能ファイルは必要に応じてメモリにデマンドページングされます。ディスク上の実行可能ファイルは、アプリケーションのバッキングストアになります。これは、ディスク上の実行可能ファイルを変更できないことを意味します。そうしないと、実行中のアプリケーションに影響を及ぼします。open(2)使用中の実行可能ファイルを書き込みに使用しようとすると、 ETXTBSY(テキストファイルがビジー)エラーが発生します(マニュアルページで確認してくださいopen(2))。

他の多くの人が言っているように、ファイルシステム()からファイルを削除するunlink(2)と、カーネルはそのファイルへの参照を維持し、参照がなくなるまでディスクから削除しません(プロセスが終了すると、ファイルへの参照を解放します)ファイル)。つまり、使用中の実行可能ファイルを最初に削除してから、古いファイルと同じ名前の新しいファイルを作成することで、実行可能ファイルを効果的に「上書き」できます。

したがって、既存のファイルを「上書き」するときにコンパイラが実行可能ファイルを作成する方法に帰着します。書き込み用にファイルを開いて切り捨てる(O_WRONLY|O_CREAT|O_TRUNC)だけの場合、エラーで失敗しETXTBSYます。最初に既存の出力ファイルを削除して新しいファイルを作成すると、エラーなしで機能します。

于 2010-07-29T00:13:00.053 に答える
0

Windowsでは、実行可能ファイルがまだ実行されている場合は実行できず、ファイルはロックされます。exeが実際に実行されていない場合は、スクリプトのコーディング方法などに応じて、新しい実行で新しいexeが取得されます。

Linuxについては知りません。

于 2010-07-28T19:13:14.870 に答える
0

使用中にWindowsがファイルをロックしたため、ファイルを置き換えることができないと思います。

于 2010-07-28T19:12:02.500 に答える
0

場合によります。私が経験したことから、Linuxでは、プログラムを削除しても(大きすぎないように)プログラムを実行できます。しかし、私はそれが定義された行動だとは思いません。

ループが進む限り、実行可能ファイルを呼び出す方法によっては、スクリプトが途中でしか記述されていないプログラムを実行しようとすると、スクリプトがクラッシュする可能性があります。

于 2010-07-28T19:12:11.847 に答える
-1

実行可能ファイル起動時にメモリに完全にロードされる場合がありますが、実行可能ファイルが十分に大きく、十分に長く実行されている場合、OSはその未使用部分の一部を交換することを決定する場合があります。

OSはプログラムのファイルがまだそこにあると想定しているため、これらのメモリブロックを実際にスワップファイルに書き込む理由はありません。したがって、それらは単に無効化されて再利用されます。プログラムがこれらのページを再度必要とする場合、OSは実行可能ファイルからそれらをロードします。

ロードされたモジュールはメモリマップトファイルであるため、Windowsではこれは実際には自動的に行われます。これは、実行中にファイルがロックされ、簡単に上書きできないことも意味します。

Linuxについてはよくわかりませんが、IIRCは同じ方法でスワッピングを行います。

于 2010-07-28T19:24:11.777 に答える