我用 C 语言为自己创建了一个网络服务器,当用户请求页面时,它连接到旧硬件。这是我所做的伪代码。
- 通过 Malloc 为所有变量只分配一个大的 memory 块。
- 运行一个无限循环来等待新的连接。
我运行无限循环的原因是因为如果我不这样做,那么只会提供一页并且程序将退出。相反,我使用 sigaction 来捕获 CTRL+C 和一些分段错误,这样我的程序可以在退出之前释放 memory。
当我阅读 sigaction 的 linux 手册时,它指出它不能捕获 SIGKILL 和 SIGSTOP,这意味着目前如果我的程序接收到这两个信号之一,那么 memory 可能不会被释放。我使用 free(memoryhandle) 释放 memory。
是否有一个包罗万象的功能,我可以用它来捕获所有可能的信号,所以当未知信号进入我的程序时,我可以强制 memory 释放?
到目前为止,这是我的代码模板(减去包含):
char* memory;
void processconnections(){
//connection processing here
}
void startserver(){
//server startup sequence
}
void myhandler(int signal){
free(memory);
}
int main(){
int size=1000000; //about 1MB to allocate
memory=malloc(size);
sigaction act={0};
sigemptyset(&act.sa_mask);
act.sa_handler=myhandler;
act.sa_flags=SA_RESTART;
sigaction(constant_for_remaining_signals,act,NULL);
startserver();
while(1){
processconnections();
}
}
我正在考虑用什么来替换 sigaction 的第一个参数,以捕获早期 sigaction 调用未处理的所有剩余信号。
任何想法?
回答1
是否有一个类似包罗万象的函数可以用来捕获所有可能的信号,这样当未知信号进入我的程序时,我可以强制 memory 释放?
不,没有。
正如其他人所评论的那样,您对这个问题的整个前提是基于您必须 free
memory 否则它将被泄露的错误信念。
在任何 UNIX 操作系统上都不会发生这种情况——当你的程序死掉时,所有 malloc()
ed memory 都会被操作系统自动释放。
此外,您担心 SIGKILL
和 SIGSTOP
会“突然”发送到您的程序,但信号不会随意发送到您的程序。如果您(或您运行的其他程序)不发送这些信号,那么您的程序将不会收到它们。