【发布时间】:2013-04-01 14:26:30
【问题描述】:
我主要来自 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 之间的操作方式上产生更多差异,我希望尽可能地在这两个平台上运行。)
这样的事情有“最佳实践”吗?
【问题讨论】:
-
当一个进程存在时,所有句柄都会自动关闭。如果这是您唯一的清理原因,那么依靠 ctrl-c 是完全有效的。
-
阅读 advancedlinuxprogramming.com 和
intro(2)手册页。另请阅读有关多路复用系统调用的信息,例如poll(2)
标签: c++ c linux windows cross-platform