是否可以在 C 语言中检测用户何时关闭控制台?

Is it possible to detect when an user closes the console in C?

提问人:Wheatley 提问时间:1/29/2023 更新时间:1/29/2023 访问量:57

问:

我想知道是否可以检测用户何时关闭控制台,然后执行释放先前 malloc 调用分配的内存的函数。

我知道像 Windows/Linux/MacOS 这样的主操作系统应该在控制台关闭时释放此内存,但我认为最好让程序尽可能少地依赖操作系统。

c 管理 malloc 动态内存分配 免费

评论

1赞 Tom Karzes 1/29/2023
这将是特定于操作系统的,而不是 C 标准的一部分。
1赞 ikegami 1/29/2023
在 unix 中,当终端关闭时,进程被发送 SIGHUP。默认情况下,这会终止您的进程,但您可以挂钩它(以及其他信号,如 SIGINT 和 SIGTERM)来执行一些清理。但是,不需要释放内存。OS 会自动释放与退出(包括终止)的进程关联的所有内存。
0赞 Wheatley 1/29/2023
@TomKarzes我明白了,所以程序应该依赖操作系统或使用操作系统提供的工具(如果有的话)。那么在这种情况下,操作系统比程序更应该归咎于糟糕的内存管理,哈哈。
0赞 Dúthomhas 1/29/2023
没有糟糕的内存管理。您的程序从操作系统获取了所有内存,操作系统会对其进行清理。这就是良好的内存管理。
0赞 Tom Karzes 1/29/2023
@Wheatley 您只需要确保在控制台关闭时退出进程。当进程退出时,将释放所有内存。你只需要确保它不会继续在后台运行。

答:

2赞 Harith 1/29/2023 #1

再:

可以检测用户何时关闭控制台,然后 执行一个函数,释放上一个 malloc 分配的内存 调用?


是的,可以捕捉到信号。

在符合 POSIX 的¹ 系统上,将发送进程。SIGHUP

宏观:int SIGHUP

SIGHUP(“挂断”)信号用于报告 用户的终端断开连接,可能是因为网络或 电话连接中断。有关此内容的更多信息,请参阅 控制模式。

该信号还用于报告控制的终止 在终端上处理与该会话关联的作业;这 终止有效地断开会话中所有进程与 控制终端。

当进程退出时,操作系统将自动内存。但是,可以使用 /² 更改默认处理并释放资源。free()signal()sigaction()

sigaction() 系统调用用于更改 接收到特定信号的过程。

注意,其行为因 UNIX 系统而异,并且不可移植。避免使用它。signal()

唯一的可移植用途是将 disposition 更改为 /。signal()SIG_IGNSIG_IGN

另请注意,C 标准和 POSIX 标准都没有指定异步信号安全,即在信号处理程序中调用它是不安全的。free()

[1] — 对于 Windows,请参阅:子进程 c++ 的 Windows 控制台信号处理

[2] — 在 POSIX 标准中定义,而不是在 C 标准中定义。sigaction()