2016-12-12 24 views
0

私は共有ライブラリについて勉強していましたが、暗黙的にdlclose()がプロセス終了時に実行されることを読んでいます。 誰がこの呼び出しを担当したのかを知りたい。 dlcloseは暗黙的に呼び出されます

#include <stdio.h> 

int main() { 
     printf("Hello World\n"); 
     return 0; 
} 

を私は ldd ./a.outをしたならば、私はこれらのライブラリの一覧を取得する:たとえば、私が書いた場合

linux-vdso.so.1 => (0x00007ffd6675c000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2569866000) 
/lib64/ld-linux-x86-64.so.2 (0x0000562b69162000) 

リンカは、これらの権利をロードするための責任があるので、誰が終了時に責任がありますこの./a.outは暗黙的に実行可能ですdlclose()これらのライブラリは?

+0

これは間違いである必要があります。プロセスの終了時に 'dlclose'は呼び出されません。 –

+0

本当ですか?私はマイケル・ケリスクのThe Linux Programming Interfaceから勉強しているので、システムプログラミングのための定評のある本です。本書では、 'すべてのライブラリの暗黙的なdlclose()はプロセス終了時に実行されます。 ' –

+0

プロセスが終了すると開いているファイルハンドルはすべて自動的に閉じられます。 DLは単なるオープンファイルなので、これもクローズドになることを意味します。 – Barmar

答えて

2

exit()に電話をかけるとき、またはmain()から戻ったときに、通常のプロセスの終了に関する話しかないと思う。 dlopen()はおそらくatexit()ハンドラを登録して、ダイナミックライブラリのすべての終了機能を実行します。

プロセスが異常終了した場合、ライブラリでコードを実行することはできません。プロセスが正常に終了するのではなく、OSによって終了された場合、OSはファイルハンドルを解放しますが、プロセスのコンテキストではコードを実行しません。

2

私はKerriskの本を持っていませんが、その内容を正確に特徴付けておけば、少し簡略化されているようです。プロセスが終了するたびに、そのオープン共有ライブラリごとに関数dlclose()が呼び出されますが、プロセスが終了するたびに、開いている共有ライブラリ上のすべてのハンドルが閉じられると言うのは妥当なことです。その結果、オペレーティングシステムは、それらの共有ライブラリのそれぞれを参照するプロセスが1つ少ないことを認識し、共有ライブラリの参照カウントをゼロにすると、OSはそれらをメモリからアンロードすることを選択する可能性があります。

dlclose()より多くのことができます。特に、ライブラリ内のデストラクタ関数が実行されます。これらの関数は、main()から戻るか、またはexit()を呼び出してプロセスが正常に終了したときにも実行されますが、_exit()を呼び出すなどの他の手段でプロセスが終了した場合や、信号の受信に応答して終了しません。通常の終了の場合、実際の効果は、オープン共有ライブラリごとにdlclose()が呼び出された場合と同じになる可能性がありますが、実際にはdlclose()を呼び出すことによって必ずしも達成されるわけではありません。

最後に、dl*()関数はPOSIXで定義されていますが、実質的にすべての動的/共有ライブラリの詳細は実装の裁量で残されています。 Linuxの本について聞いたことがあるので、私はいくつかのLinux固有の詳細を参照しました。

+0

'dlclose()'の本格的な呼び出しの代わりに、Kerriskが意味するのは、そのライブラリへのオープンカウントの参照が減っているということです。 –

+0

@AbhinavJain、私の答えはすでにKerriskの意図について言いたいことがすべて含まれています。私は彼が完全に間違った情報を提供するのではなく、単純化していたと推測しています。しかし、自分で本を読んでいないと、私がやったのと同じように、その行為を説明して、それを本と和解させることができます。 –

関連する問題