5

私はCでいくつかのapache(2.2)モジュールを書いていますが、それはかなり新しいので、疑問に思っていました。

Apacheサーバーが実行を開始するたびに開始されるグローバル変数を作成できるかどうかを知る必要があります。

ほら、ホスト名のリスト(「特権」になる)が必要なので、要求を受け取るたびに、ホスト名がリストに表示されるかどうかを確認する必要があります(「特権」かどうかを確認するため)。

したがって、リストはグローバルである必要があり(すべてのサーバーインスタンスがリストの同じインスタンスを持つように)、最初に初期化する必要があります。

可能であれば、どうすればよいですか?

ありがとう!

4

2 に答える 2

5

完全な答えではありませんが、私はなんとかグローバル変数を持つ方法を見つけることができました。

プロセスのグローバルプール(pconfとpool)でapr_pool_userdata_getandメソッドを使用しました。apr_pool_userdata_set

詳細については、http://apr.apache.org/docs/apr/0.9/group_apr_pools.htmlを参照し
ください

例:

静的グローバルデータをサーバープロセスプールにアタッチする

char *data = "this is some data";
apr_pool_userdata_setn ((void*) data, "myglobaldata_key", NULL, request->server->process->pool);

マロックされたヒープデータをサーバープロセスプールにアタッチする

char *data = strdup("this is some data");
apr_pool_userdata_setn ((void*) data, "myglobaldata_key", (apr_status_t(*)(void *))free, request->server->process->pool);

次に、グローバルデータを取得します。

char *data;
apr_pool_userdata_get ((void**)&data, "myglobaldata_key", request->server->process->pool);
if (data == NULL) {
    // data not set...
}
于 2011-06-17T12:15:07.977 に答える
0

このリンクは、モジュールで静的/グローバル変数を使用できることを示しています。複数のスレッドからアクセスする場合は注意が必要です。私の観察では、複数のプロセスが存在する可能性がある場合(グローバル変数はプロセス内に存在し、多くのスレッドで共有されます)、静的は初期化されると期待すべきではありません。つまり、一度初期化するだけではおそらく十分ではありません。

http://httpd.apache.org/docs/2.2/developer/thread_safety.html#variables

于 2015-02-20T20:02:53.907 に答える