[pgsql-jp: 27855] Re: バックエンドのプロセスIDを取得したい(サマリ)

Jun Kitamura kitamura @ zoozee.jp
2002年 11月 1日 (金) 11:17:01 JST


北村@zoozee です。

[pgsql-jp: 27851]
sugita @ sra.co.jp wrote:
>   「どの数字が自分なの?」のために、こうしました。
(略 サマリ参照)

ありがとうございます。コレは良いですね。使わせていただきます。

> contrib/miscutil/misc_utils.c に古い形式の関数定義で pid 返
> すのがあります。 

ここは探していませんでした。getpid() を呼び出してるだけです
ね(まぁ、それでいいんですが(笑))。

[pgsql-jp: 27853]
Tatsuo Ishii <t-ishii @ sra.co.jp> wrote:
> 要するにgetpid(2)呼び出す関数を作ればいいわけですが,getpid()のように
> 引数がいらず,かつ戻値がスカラーであるような関数は,「プログラムレス」:-) 
> でC関数が安直に作れます.
(略 サマリ参照)

目から鱗です!言われてみれば「なるほど」・・・という感じです。
環境に気をつければお手軽でいいですね。(自宅サーバーはこれで
チャチャッとやってしまいました)。
条件に合えば他の関数、例えば商用のものでも OK なんですね。ちょっ
と感動。

-------ここから サマリ
Q)
 バックエンドのプロセスID(PID)を取得したい
 (環境は PostgreSQL 7.2 , JDK1.4 JDBC使用)

A1)
 org.postgressql.Connection の public int pid を利用。
 リトルエンディアンからビッグエンディアンに変換の必要あり。
--- ここから エンディアン変換式(リトルtoビッグ)
--- (備忘メモ JDKに標準で用意されているかも)
intBE = ( intLE << 24 ) | ( ( intLE & 0xff00 ) << 8 ) |
        ( intLE >> 8 ) & 0xff00 ) | ( intLE >> 24 );
--- ここまで
 (メモ)
  ・コネクションと同時に PID が取得できる。
  ・将来、エンディアン変換は不要になるかも(Connection 内部
   で修正されたり、プロトコルレベルで修正されたり、
   PG_Stream 内部で修正されたり)。
  ・PostgreSQL側のバージョンを気にしないでよい(7.2 or 7.3)。

A2)
 [27851] 杉田さんのユーザー定義関数
 この関数から、自分のバックエンドIDが取得できる。
 この関数の返り値を pg_stat_get_backend_pid(int4) に渡す。
 select pg_stat_get_backend_pid(pg_get_beid());
--- ここから pg_get_beid.c
#include "postgres.h"
#include "fmgr.h"
#include "backendid.h"

PG_FUNCTION_INFO_V1(pg_get_beid);

Datum pg_get_beid(PG_FUNCTION_ARGS)
{
	PG_RETURN_INT32(MyBackendId);
}
--- ここまで
 (メモ)
  ・その他の pg_stat_get_* 関数に利用できる。
  ・関数自体はプラットフォーム非依存。(たぶん)

A3)
 [27853] 石井さんのユーザー定義関数
 「引数無し、返り値スカラー」の共有ライブラリ関数を利用。
 getpid(2) をライブラリから直接呼び出す。
--- ここから
CREATE FUNCTION getpid() RETURNS INTEGER AS
 '/lib/libc.so.6' LANGUAGE 'c';
--- ここまで
 (メモ)
  ・プログラムレスでお手軽。
  ・プラットフォーム依存。

(その他メモ)
 ・7.3 には pg_backend_pid() がある。
 ・7.2 で 関数名を pg_backend_pid() としてやることで、バー
  ジョンアップ時にクライアント側プログラムの変更を無くす。
-------ここまで サマリ

杉田さん、石井さん、ありがとうございました。





pgsql-jp メーリングリストの案内