|
Top > 共有メモリをAPRで使用するには 共有メモリはAPRでどのように使用するか。 概要apr_shm.hに定義されている以下の関数群を用いる。 APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, apr_size_t reqsize, const char *filename,apr_pool_t *pool) apr_shm_createは共有メモリ領域を生成するのに用いる。 mは生成したい共有メモリ構造体、reqsizeは生成したい共有メモリのサイズ、 filenameはネームベース共有メモリシステムを使用するためのファイル名、 poolには共有メモリを取得するためのプールを渡す。 APR_DECLARE(apr_status_t) apr_shm_attach((apr_shmt_t **m, const char *filename, apr_pool_t *pool) apr_shm_attachは取得した共有メモリを他のプロセスで使用するために領域をアタッチするためのAPI。 mはapr_shm_createで生成した共有メモリ構造体、 fileにはmを生成した際に使用したファイル名、 poolには共有メモリを取得するためのプールを渡す。 APR_DECARE(void *) apr_shm_baseaddr_get(const apr_sm_t *m) apr_shm_baseaddr_getは取得した共有メモリの実際のアドレスを取得するのに用いる。 返却値がアドレスとなるが、void型へのポインタであることに注意。 mにapr_shm_createで生成した共有メモリ構造体を渡す。 注意点: Apacheが異常終了し、使用していた共有メモリが削除されないまま再起動されると、 apr_shm_create時にFile Existsエラーが発生する。 そのため、apr_shm_create前にapr_shm_remove(const char *filename, apr_pool_t *pool)で 共有メモリ用Fileを一度削除すると良い。 参考:http://qaix.com/apache-http-server/191-538-apr-shm-attach-and-apr-eexist-read.shtml 実際に使用するには、 http://acapulco.dyndns.org/mod_uploader/module_dev.htm を参考にすると良い。 Apacheのプールを用いて共有メモリを使用する場合、デタッチや削除は必要ない。 (apache側で行われる) 以下自分用メモ: サーバプールやプロセスプールを用いればapr_shm_attachは可能だが、 リクエストプールでは不可能の模様(Permission deninedされる) mod_uploaderの参考例ではコンフィグファイルを生成し、ap_get_module_configで各ステージで読み込みを 行っており、その場合上手く構造体を作ってやれば、データ取得が可能と思われる。 (自分で作成したものはグローバルでapr_shm_tを複数個宣言しているが、それらを纏めた構造体を 一個コンフィグとして生成すれば良いだろう・・・時間があればやってみる?) |