我来自一个主要的Windows环境,所以我有点迷失在Linux中编写一些东西的过渡。
说我有一个像这样的简单C / C ++应用程序:
int main(int argc, char** argv)
{
int h = open("something");
while (true)
{
// do work
usleep(10000);
}
close(h);
}
在Windows中,我会使用GetAsyncKeyState()
(或其他类型的键盘检查功能)来查找说出转义键,并在按下时退出循环。这样我的close(h)
就会被调用,我会做我需要的所有清理工作。
我在Linux中终止我的应用程序的方式是使用 CTRL + C ,从我的阅读意味着它发送SIGINT
,并且导致应用程序退出的“友好”方式。然而,根据我的经验,这只会导致它放弃一切并关闭它获取该信号时的任何地方(意味着我的后循环清理永远不会运行。)
有些人建议我使用signal()
来监听SIGINT
,但其他人不同意这种方法。 (另外,它往往会在Windows和Linux之间的工作方式之间产生更多的差异,我希望尽可能保持在两个平台上运行。)
这样的事情是否有“最佳实践”?
答案 0 :(得分:3)
使用SIGINT
处理程序实际上是在POSIX世界中处理这些事情的常用方法,类似于在Windows中使用SetConsoleCtrlHandler
。
在SIGINT
信号处理程序中,设置一个标志,如果它应该退出,则循环检查该标志。
但是,除非您在清理过程中有特殊需求(例如向其他应用程序发送再见消息或类似消息),否则不是严格需要的。操作系统将确保所有文件都正确关闭,所有内存分配都是免费的,等等。与Windows中的相同。
答案 1 :(得分:3)
SIGINT的默认操作是以正常方式终止程序。当程序以这种方式退出时,所有打开的文件都会自动关闭,因此close
未明确运行并不重要。
当然可以设置一个信号处理程序来关闭程序,但对于这样的事情来说,它会有点过分。通常,如果您按ctrl-c退出程序,则需要非常快速的终止。
如果您打开了几个已写入的文件,并且它们都需要处于相对于彼此的一致状态,您可能需要处理该信号。
答案 2 :(得分:1)
通常当你做一个getch();你的程序的输入被阻止,直到一个键被击中。这在unix世界中被称为“规范”处理(canons =规则)。你可以把它关掉。因此,当你做一个getch();并且没有按下任何键,它将立即返回-1或任何类型的错误代码。
对我来说已经15年了,所以我不确定具体细节,但是,如果你使用谷歌ioctl,termio,规范,非规范,你马上就会得到答案。
但希望有人能够为您发布几行代码!对不起我只有一分钟可以回答。