Я создаю несколько приложений FastCGI, и мне кажется, что lighttpd не убивает их после того, как они простаивают, поэтому я пытаюсь их закрыть самостоятельно.
Я пытался использовать
signal(SIGALRM, close);
alarm(300);
и с функцией закрытия выполнить 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);
}