我正在构建一些 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);
}