我的程序是否需要能够处理 SIGINT?

问题描述

我是否应该担心处理用户在使用我的程序的过程中传递 SIGINT 的事件?

有问题的程序处理堆分配和释放,所以我担心这种情况会导致内存泄漏。当我在使用程序的过程中传递 SIGINT 时,Valgrind 说:

==30173== Process terminating with default action of signal 2 (SIGINT)
==30173==    at 0x4ACC142: read (read.c:26)
==30173==    by 0x4A4ED1E: _IO_file_underflow@@GLIBC_2.2.5 (fileops.c:517)
==30173==    by 0x4A41897: getdelim (iogetdelim.c:73)
==30173==    by 0x109566: main (main.c:55)
==30173== 
==30173== HEAP SUMMARY:
==30173==     in use at exit: 1,000 bytes in 1 blocks
==30173==   total heap usage: 3 allocs,2 frees,3,048 bytes allocated
==30173== 
==30173== LEAK SUMMARY:
==30173==    definitely lost: 0 bytes in 0 blocks
==30173==    indirectly lost: 0 bytes in 0 blocks
==30173==      possibly lost: 0 bytes in 0 blocks
==30173==    still reachable: 1,000 bytes in 1 blocks
==30173==         suppressed: 0 bytes in 0 blocks
==30173== Rerun with --leak-check=full to see details of leaked memory
==30173== 
==30173== For lists of detected and suppressed errors,rerun with: -s
==30173== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

解决方法

答案取决于操作系统。大多数现代操作系统会在你的进程被杀死后清理它分配的内存(Windows、Linux、一般的 *nix 等等)。这通常只是操作系统内存隔离和保护系统的一部分,其中每个进程都有自己的虚拟内存映射,并且通过引用计数分配/释放与该映射对应的物理页面(被杀死/退出的进程将减少引用计数到其映射的物理页面,如果它们达到零则释放它们)。

如果您计划在晦涩的嵌入式系统上运行您的进程,而在内存管理方面没有这样的保证,那么您可能需要担心这样的事情。否则,如果内存管理是您唯一关心的问题,那么这不是问题。

如果您想考虑退出时应该发生的其他事情(例如保存状态),那么您肯定需要捕获 SIGINT,可能还需要捕获其他信号。