【问题标题】:What happens when interrupting a C program with a signal like SIGINT?当使用 SIGINT 之类的信号中断 C 程序时会发生什么?
【发布时间】:2021-08-07 10:54:59
【问题描述】:

所以在完成我的个人项目之前,我想到了这个问题。因此,我还想知道是否需要在进程终止之前进行任何特殊操作来进行清理(例如释放所有动态分配的内存)还是由 Linux 内核处理。

感谢任何帮助

【问题讨论】:

  • 操作系统将在进程终止后回收进程分配的所有内存。但与此同时,编写尽可能多的清理代码也是一种好习惯。
  • @kaylum:在进程退出时“清理”内存是一种浪费,而且不是好的做法。当应用程序被告知要退出并花费几秒钟或更长时间做无用的工作时,它会导致延迟,这会激怒用户并在系统继续执行有用的工作时不必要地占用系统资源。当然,软件应该被设计成仔细管理它的内存,而不是不恰当地忘记它,但在终止时不需要“清理”。 (当然需要完成一些终止工作,例如刷新未写入的缓冲区。但不是释放内存。)
  • @EricPostpischil 在挑战“清理并优雅地关闭”货物崇拜时要小心,否则你会和我一起进入异端的地牢:)
  • @EricPostpischil,我同意在退出时清理可能会浪费资源。特别是如果事情被分页到磁盘。但是清理也有一个重要的功能,它可以让你证明你已经跟踪了所有使用的内存。所以在开发过程中,我建议总是在退出时清理。有总是创建清理代码的习惯,意味着它在你需要的时候就在那里。稍后当您需要跟踪内存泄漏错误时添加它几乎是不可能的。
  • @HAL:关于“它可以让你证明你已经跟踪了所有使用的内存”:它没有这样的事情。如果省略任何free,则不会出错。

标签: c linux linux-kernel signals


【解决方案1】:

当您的进程退出时,Linux 系统将回收其所有资源,无论您的进程如何退出。

如果您允许SIGINT 终止您的进程,而不是捕获并处理它,则缓冲区可能保持未刷新。如果您希望您的程序在退出之前干净地完成任何工作,您需要设计您的程序,以便它可以捕获信号并执行任何所需的终止工作。

【讨论】:

  • 感谢您的有用回答。请问未刷新的缓冲区是什么意思?
  • @yankh18:默认情况下,C 标准输出是行缓冲的。缓冲意味着 C 库将数据保存在内部数组中。行缓冲意味着数据仅在遇到换行时才写入底层设备或文件。例如,如果您执行printf("Hello, "); sleep(5); printf("World!\n");,则在五秒延迟之前您将看不到第一部分,因为 C 库在内部对其进行了缓冲(“未刷新”)。你需要说printf("Hello, "); fflush(stdout); sleep(5); printf("World!\n");。缓冲不仅影响标准流,还影响您打开的所有文件。
猜你喜欢
  • 1970-01-01
  • 2019-06-05
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多