私はいくつかの FastCGI アプリを構築していますが、アイドル状態になった後に lighttpd がそれらを強制終了しないというバグがあるので、それらを自分で閉じようとしています。
使ってみた
signal(SIGALRM, close);
alarm(300);
close 関数に exit(0) を実行させると、ほぼうまく機能します。
問題は、メイン プログラムのループが実行されるたびに close 関数が呼び出されることです (ループをリセットするたびに alarm(300) を呼び出します)。alarm() のマニュアル ページを読みましたが、同じ値で複数回呼び出すと SIGALRM が作動するようには見えないので、Lighttpd がアラーム信号を送信していると想定しています。
大きな質問です!特定の間隔の後にメソッドを実行し、その間隔を SIGALRM なしでリセット可能にする方法はありますか? 目覚ましも複数あればいいのに。
これまでのアプリ全体は次のとおりです。
#include <stdlib.h>
#include <stdarg.h>
#include <signal.h>
#include "fcgiapp.h"
FCGX_Stream *in, *out, *err;
FCGX_ParamArray envp;
int calls = 0;
void print(char*, ...);
void close();
int main(void)
{
// If I'm not used for five minutes, leave
signal(SIGALRM, close);
int reqCount = 0;
while (FCGX_Accept(&in, &out, &err, &envp) >= 0)
{
print("Content-type: text/plain\r\n\r\n");
int i = 0;
char **elements = envp;
print("Environment:\n");
while (elements[i])
print("\t%s\n", elements[i++]);
print("\n\nDone. Have served %d requests", ++reqCount);
print("\nFor some reason, close was called %d times", calls);
alarm(300);
}
return 0;
}
void print(char *strFormat, ...)
{
va_list args;
va_start(args, strFormat);
FCGX_VFPrintF(out, strFormat, args);
va_end(args);
}
void close()
{
calls++;
// exit(0);
}