c - 捕获 C 中的所有信号以避免 memory 泄漏

我用 C 语言为自己创建了一个网络服务器,当用户请求页面时,它连接到旧硬件。这是我所做的伪代码。

  1. 通过 Malloc 为所有变量只分配一个大的 memory 块。
  2. 运行一个无限循环来等待新的连接。

我运行无限循环的原因是因为如果我不这样做,那么只会提供一页并且程序将退出。相反,我使用 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 都会被操作系统自动释放。

此外,您担心 SIGKILLSIGSTOP 会“突然”发送到您的程序,但信号不会随意发送到您的程序。如果您(或您运行的其他程序)不发送这些信号,那么您的程序将不会收到它们。