gpt4 book ai didi

c 替代 signal() + alarm()

转载 作者:行者123 更新时间:2023-12-04 05:46:00 26 4
gpt4 key购买 nike

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

最佳答案

最好的方法是:添加一个线程,这样你就可以删除信号和警报,并同步线程和你的主代码(主线程)。

关于c 替代 signal() + alarm(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1551722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com