• 締切済み

Linuxでexit()をフックするには?

glib内のある関数のパフォーマンスを調べるために、 ログを埋め込もうとしています。 手法としては、あらかじめメモリ領域を確保しておき、 glibc内でメモリ上にログを吐き出し、 glicを使用するアプリケーション終了時(exitシステムコール実行時)に、 ログを出力しようと思います。 そこで質問なのですが、 Linuxのglibc(2.3.3)でexit()をフックして、 自前の関数を呼び出す方法はありますか? ご存知なら教えてください。

みんなの回答

回答No.2

フックではなく、終了時に呼び出される関数を指定することになりますが、 __attribute__((destructor)) が使えるかも知れません。 gcc拡張だったと思いますが、正常終了する限りにおいては呼び出されるはずです。 ご希望に合うかは分かりませんが、一応。

全文を見る
すると、全ての回答が全文表示されます。
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

atexit()では不足でしょうか?

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/atexit.3.html
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エラー処理,メモリ開放,exit

    こんばんは。現在、次のような C のプログラムを作っています。 ・ 動的にメモリを確保した配列や構造体が複数ある。 ・ しばしば,関数呼び出しのネストが複数(2~4) になる。 ・ ”エラーチェック => エラーなら終了” という動作が多い。 このようなプログラムで,"エラー => プログラム終了" の際,動的に確保したメモリを,関数呼び出しのネストを(return文 で)遡って,全て開放すべきでしょうか。 このようにすると,あまりにプログラムが煩雑になるので,今は "エラー => exit(-1) で直ちに終了" としています。 しかし改めて C の教科書を見ると,exit の時,オープンされているファイルやストリームについては,捨てられ,あるいは閉じられる,と書いてありますが,メモリについては何も書かれていないので,どうするべきか少し悩んでいます。 みなさんはこんな場合,どうされていますでしょうか? ご意見を下されば幸いです。よろしくお願いします。

  • 古いパソコンに最適なLinuxとは

    自分の持ってる古いパソコンが将来新型Windows 10の最低動作スペックに完全に追いつかなくなりWindows 10をやめてLinuxにしようとなった時、下記のスペックのパソコンに向いてるLinuxは何になるんですか? 機種はGateway M-1630j OSは当時はWindows Vista 32bit  ちょっと前にはWindows 7 32bitにした時があり今はWindows 10 32bitで使ってます。Blender2.74でリアルな3Dモデルのモデリングが難なく行えてます。 CPUはAMD AthlonTM 64 X2 モバイルテクノロジー メモリは当時は1GB 今は増設して4GB グラフィック機能はATI Radeon® X1270 HDDは160GB (5,400rpm、SATA) LinuxでBlender2.74を使うにはlinux-glibc211-i686.tar.bz2か linux-glibc211-x86_64.tar.bz2のどちらかになるみたいなんですが、 そもそも上記のスペックのパソコンにlinux-glibc211はインストールできて 動作可能なんでしょうか? あとLinuxにBlenderをインストールする方法はWindowsみたいにインストーラーみたいなのからインストールできるんですか? https://download.blender.org/release/Blender2.74/

  • c言語のmalloc関数、またrealloc関数

    c言語のmalloc関数は確保するメモリの領域を、配列としてのみしか処理出来ないのですか。 つまり、malloc関数で確保したメモリの領域を変数、また多次元配列、また構造体としては処理出来ないのでしょうか。 c言語のrealloc関数は以前の確保したメモリの領域から、確保し直したメモリの領域の場所が変わるかもしれないという事ですが、この場合の場所が変わるという意味は、メモリの領域のアドレスが変わるという事でしょうか。 また、以前の確保したメモリの領域に代入していたデータが使用出来なくなるという事でしょうか。

  • Linux での swap の容量について

    昔から UNIX では swap の容量はメモリの2倍や3倍がよいと言われていたようですが、 Linux ではそんなことはなく、メモリが多ければ swap なしでも問題なく動くとつい先ほどまで信じていたんですが、「Linux教科書 LIPCレベル1 (ISBN4-7981-0292-X)」という本を買って、swap に関する説明を見たら「スワップ領域は塔載メモリと同程度を確保します。」と書いてありました。 これは一体どういうことでしょうか? 本当に Linux は swap の容量を塔載メモリと同じ程度にしなければいけないんですか? だとするとその根拠はなんでしょうか? p.s. 根拠がなくても資格試験でそういう問題が出て塔載メモリと同じ程度と答えないと点がもらえないというのならそう答えますが、非常に気になります。

  • LinuxのDMA転送でのメモリ操作について

    Linux初心者です。 ユーザモードで動作しているプロセスからデバイスドライバに対してDMA転送要求を行った場合、ドライバでDMAバッファ用のメモリを確保すると思います。 ドライバはDMA転送用バッファとして、GFP_DMA指定でkmallocし、確保されるメモリ領域はZONE_DMAだと思います。 (PCIデバイスドライバの場合は、上記指定は必須ではないみたいですが。) ここで疑問なのですが、カーネルモードでしかアクセスできないZONE_DMA領域を、ユーザモードのプロセスがどのように扱うのでしょうか? ある本で「ユーザモードで動作中でもシステムコールに関してはCPU内でカーネルモードで動作する」というのを見たことがあるのですが、これによってZONE_DMA領域にアクセスできるようになるということでしょうか? ご存知の方がいたら、よろしくお願いします。 また、そもそも質問内容(前提)の間違えなどありましたらご指摘いただきたいです。

  • Linux用のパーティション。

    Linux用のパーティション。 Windows 7に、デュアルブートで、Fedora7を入れたいと思っています。 本を買ってきてそのDVDからインストールしますが、説明の中に、 「一度Windowsのパーティションを消して、Windows用に必要な領域だけ確保します。」 「インストールDVD-ROMから起動しインストール先パーティションを設定する時に作成しなおします。」 「Windowsのパーティションは、1つにしておきましょう。このとき、Linux用の領域は、フォーマットせずに、空けておきます。2.5Gバイト以上が必要です。」とあります。 これは、Linux用のパーティションをLinux 3GBとか作っておくということでしょうか?フォーマットせずに、空けておきますというのは、どういう意味でしょうか? 初心者(たこ)なので、よくわかりません、よろしくおおしえください。

  • Redhat Linux7.3のメモリ使用率が95%になってしまいました

    現在、サーバをデータセンターへ置いているのですが、サーバのメモリ使用率が90%を超えているというアラートがあがってきました。 実際にメモリの使用内容をみてみると、キャッシュとバッファが領域をとっているだけのように見えます。 Linuxはメモリの確保が特殊なのでしょうか? データセンターにはメモリ使用率の監視をとめてもらった方がいいのか悩んでます。 どこかに正式な文章とかありましたらリンク先をご紹介していただけないでしょうか。

  • Linuxのメモリ解放処理

    質問内容を下記にまとめてみました。 どなたかお詳しい方、ご回答下さいませんでしょうか。 情報ソースへのリンクでも構いません。よろしく お願いします。 【環境】 PCサーバ;PentiumIII 1GHz*2、2GB SDRAM、60GB*3 HDD(RAID5;記憶領域約120GB) Redhat Linux7.1J Oracle 8i for Linux(8.1.7) 【現象】 OS起動時からRAMをほとんど開放せず、処理の度にHDDから読み込んだデータをRAM上に展開し続けている。 残りの空きメモリが4MBを割り込んだ辺りから空きメモリの減少が止まる。問題なく処理は続行されている。 この間、約2GB確保されたスワップ領域は全く使用されていない。 以上は、Oracle上でPL/SQL及びCのプログラムを実行している際に確認された。 【仮説】 ・Linuxは可能な限りメモリ上にキャッシュを残す仕様となっていて、残り空きメモリが一定の水準以下になるタイミングになって初めて割当済みメモリを解放しているのではないか。 【疑問】 1.割当済みメモリ解放の閾値の設定はどこで行っているのか 2.スワップ領域が使用されていないのはなぜか

  • free関数の挙動がわからない

    free関数は動的確保したメモリを空き領域として登録するそうですが、アドレスを渡すだけでなぜ確保したメモリ領域を開放できるのでしょうか?アドレスだけでメモリ全体の大きさがわかる仕組みがあるのでしょうか。 回答よろしくお願いします。

  • 動的なメモリ領域の確保

    double型変数5個分のメモリをmalloc関数により確保し,その確保した要素のアドレスを表示するように,プログラムを作る問題で、 (注)に「 %pで表示するためには,double型へのポインタ(double *)をvoid型へのポインタ(void *)にキャストする必要がある.」と書かれていたのですが、どういうことでしょうか? 以下のようでいいのでしょうか? #include<stdio.h> #include<stdlib.h> #define COUNT 5           // 動的に確保するメモリ領域数を示すマクロ定数の定義 int main(void) {  // 動的に確保するメモリ領域のアドレスを保持するポインタ変数の宣言  double * pointer;  int i;                  // for文で使用する変数の宣言  // int型変数5個分のメモリ領域を確保  pointer = (double *)malloc(sizeof(double) * COUNT);  if(pointer == NULL) {        // メモリ領域の確保が失敗した場合   printf("メモリ領域を確保できませんでした.\n");   exit(1);                // プログラムの終了  }  for(i = 0; i < COUNT; i++)   printf("%d番目のアドレスは%pです.\n", i + 1, pointer + i);  free(pointer);            // 確保したメモリ領域の解放  return 0; }