【发布时间】:2011-11-27 18:37:51
【问题描述】:
我正在尝试编写一个信号处理程序来捕获任意数量的连续 SIGINT 信号并防止程序退出。该程序是一个简单的文件服务器。处理程序设置一个全局标志,导致接受新连接的 while 循环结束,对 pthread_exit() 的调用确保 main 让当前连接在退出之前完成。当我按一次 ctrl-C 但第二次立即退出程序时,一切都像发条一样。
我首先尝试使用信号():
signal(SIGINT, catch_sigint);
...
static void catch_sigint(int signo)
{
...
signal(SIGINT, catch_sigint);
}
我也用 sigaction 试过:
struct sigaction sigint_handler;
sigint_handler.sa_handler = catch_sigint;
sigemptyset(&sigint_handler.sa_mask);
sigint_handler.sa_flags = 0;
sigaction(SIGINT, &sigint_handler, NULL);
不确定如何“重新安装”这个我只是在处理程序中复制了这段代码,类似于使用 signal() 方法的处理程序。
这些都不如我所料。
附加信息:
该程序是一个简单的文件服务器。它接收来自客户端的请求,该请求只是一个由请求的文件名组成的字符串。它利用 pthreads 以便可以同时进行传输。收到 SIGINT 后,我希望服务器退出 while 循环并等待所有当前传输完成然后关闭。照原样,无论我如何编写信号处理程序,第二个 SIGINT 都会立即终止程序。
int serverStop = 0;
...
int main()
{
/* set up the server -- socket(), bind() etc. */
struct sigaction sigint_hadler;
sigint_handler.sa_handler = catch_sigint;
sigint_handler.sa_flags = 0;
sigemptyset(&sigint_handler.sa_mask);
sigaction(SIGINT, &sigint_handler, NULL);
/* signal(SIGINT, catch_sigint); */
while(serverStop == 0)
{
/* accept new connections and pthread_create() for each */
}
pthread_exit(NULL);
}
...
static void catch_sigint(int signo)
{
serverStop = 1;
/* signal(SIGINT, catch_sigint) */
}
我不认为任何其他代码可能是相关的,但请随时要求详细说明
【问题讨论】: