rm
共有ライブラリに依存するプログラムの実行中に、危険なしに共有ライブラリを削除できますか(コマンドを使用)。私の考えでは、プログラムが実行されている場合、ライブラリから必要なすべてのデータがメモリにロードされるため、そう思います。
しかし、私はライブラリ(echo 123 > somelib.so
)を書き換えると、次の理由でそれに依存するプログラムが破損していることがわかりました。Bus error
ライブラリがすでにメモリにあり、ディスクのライブラリが変更されてプログラムがクラッシュするのはなぜですか?ライブラリがメモリに存在しない場合、ディスクから削除してもプログラムを実行し続けることができるのはなぜですか?ライブラリのデータはどこで読むのですか?
ベストアンサー1
通常、文書はそうではありません。実際にdeleteを使用すると、削除されますが、rm
開いているすべてのファイルハンドルも閉じた後にのみ可能です。ファイルがプロセスのメモリにマッピングされても、これが適用されると確信しています。その後、rm
ファイルを再度開くことはできませんが、データとマッピングはそのまま残ります。
ファイルデータの「バージョン」が1つだけで、すべての読み取り、書き込み、共有マッピングが同じデータにアクセスするため、ファイルの変更は別の話です。ここにゴミを書くと、そのファイルでコードを実行するプロセスもゴミを得ることになります。 Linuxでは、実行可能ファイルを使用してこれを実行することはできず、エラー(「テキストファイルを使用中」)が発生しますが、共有ライブラリに対するこれらの保護はありません。
(試してみるcp -a /bin/cat /tmp/cat; /tmp/cat &
ことができます。次に試してください。echo 123 >> /tmp/cat
次にfg
戻りcat
、Ctrl-Cを押して閉じます。)
rm
技術的には、これは実際にファイルをまったく削除せずにファイル名だけを削除すると言うことができます。ファイルは複数の名前を持つことができ、それをハードリンクと呼びます。ただし、これは基本的に同じファイルの複数の名前にすぎません。実際の削除は、一般的に姓が削除され始めますが、やや独立しています。