2017-10-19 5 views
1

メモリマッピングされたファイルを閉じることができない場合は、 (munmap syscallを使用)成功結果(= 0)私はまだファイルレコードをlsof -nに見ることができます。まだマップされていないので、メモリマップされたファイルはまだ参照されていないので閉じられません。

Linuxでは、mmapのmanページによると、closing the file doesn't unmap the fileが明示されています。

実際には2つのOS間で異なる動作ですか? この異なる動作の説明はありますか?

EDIT:以下のコメントを読んだあと、プラットフォーム間での動作が異なること、そしてまだファイルが開かれている理由がmmapによって参照されていることがわかりました。

おかげ

+0

LinuxとMacOSの間でアプリケーションの使用パターンが異なることはありますか?ファイルを実際に閉じる前に閉じる*と*ファイルのアンマップが必要になると思います。 Linuxはおそらくその命令に無関心ですが、おそらく最初に行われるMacOSの心配です。 – wallyk

+1

mmapのためファイルがまだ使用中です...あなたがしたのは、詳細記述子です。 –

+0

Linuxでテストしましたか? 'lsof -n'出力に* 2 *のエントリがあります –

答えて

3

POSIXは似ても似つか後mmapによってファイルへの参照があることが必要です。

mmap()関数は、そのファイル記述子の後続のclose()によって削除されないファイル記述子fildesに関連付けられたファイルへの追加参照を追加します。ファイルへのマッピングがなくなると、この参照は削除されます。

それで、lsofには、そのファイルへの参照があります。したがって、文書化されているように動作しています。

+0

私のプロセスは、マウントポイント内のすべてのファイルを実際に開いてマッピングし、閉じます。したがって、最初にマップ解除せずにファイルを閉じると、「システムに開いているファイルが多すぎます」というメッセージが表示されます。だから私はこれが期待されていることを理解しています..しかし、私はファイルディスクリプタに従ってマップをアンマップしようとすると、それは動作する必要がありますか? – Zohar81

+1

@ Zohar81:open()はファイルの参照カウントをインクリメントします。 mmap()も(現在2つのリフェンスがあります)。 close()はそれを減らします(現在:1)。 munmap()の後でカウントはゼロに落ちます。 – wildplasser

+0

あなたのシステムで[上限を上げる](https://superuser.com/a/443168)を試すことができます。明らかにマップされたファイルがあまりにも多く、またはファイル記述子を開くことを望んでいません。ファイルを閉じても、同じファイルのマッピングを解除することはできません。あなたはそれをmmap'ing直後に閉じることができます。その後、必要なときにmunmapします。 – usr

関連する問題