Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';Linux中清理无限循环应用程序的正确方法是什么?_C++_C_Linux_Windows_Cross Platform - Fatal编程技术网

C++ 什么';Linux中清理无限循环应用程序的正确方法是什么?

C++ 什么';Linux中清理无限循环应用程序的正确方法是什么?,c++,c,linux,windows,cross-platform,C++,C,Linux,Windows,Cross Platform,我来自一个主要的Windows环境,所以我有点迷失了在Linux中编写一些东西的过渡过程 假设我有一个简单的C/C++应用程序,如下所示: int main(int argc, char** argv) { int h = open("something"); while (true) { // do work usleep(10000); } close(h); } 在Windows中,我会使用类似于GetAsync

我来自一个主要的Windows环境,所以我有点迷失了在Linux中编写一些东西的过渡过程

假设我有一个简单的C/C++应用程序,如下所示:

int main(int argc, char** argv)
{
    int h = open("something");

    while (true)
    {
        // do work
        usleep(10000);
    }

    close(h);
}
在Windows中,我会使用类似于
GetAsyncKeyState()
(或其他类型的键盘检查功能)的东西来查找(比如)escape键,并在按下它时中断循环。这样我的
close(h)
就会被调用,我会做所有需要的清理工作

我在Linux中终止应用程序的方式是使用CTRL+C,据我所知,这意味着它发送
SIGINT
,这是导致应用程序退出的“友好”方式。然而,根据我的经验,这只会导致它在收到信号时几乎放下所有东西并关闭任何位置(这意味着我的后循环清理从未运行过)

一些人建议我使用
signal()
来监听
SIGINT
,但其他人不同意这种方法。(另外,它往往会在Windows和Linux之间产生更多的差异,我希望尽可能接近于在这两种平台上运行。)


像这样的事情有“最佳实践”吗?

在POSIX世界中,使用
SIGINT
处理程序实际上是处理这些事情的正常方法,类似于在Windows中使用

SIGINT
信号处理程序中,设置一个标志,循环检查该标志是否应该退出


但是,它不是严格需要的,除非您在清理过程中有特殊需要(例如,向其他应用程序或类似应用程序发送再见消息)。操作系统将确保所有文件都已正确关闭,所有内存分配都已释放,等等。与Windows中相同。

SIGINT的默认操作是以正常方式终止程序。当程序以这种方式退出时,所有打开的文件都会自动关闭,因此
close
没有显式运行并不重要

设置一个信号处理程序来关闭程序当然是可能的,但是对于这样的事情来说,这就太过分了。通常,如果您按ctrl-c退出程序,您会期望非常快速的终止


如果您打开了多个已写入的文件,并且它们都需要处于相对一致的状态,那么您可能需要处理该信号。

通常在执行getch()操作时;您的程序的输入将被阻止,直到按下一个键。这在unix世界中称为“规范”处理(canons=rules)。你可以把它关掉。因此,当您执行getch()时;如果没有按下任何键,它将立即返回-1或任何类型的错误代码

我已经15年了,所以我不确定具体细节,但是,如果你用谷歌搜索ioctl、termio、规范的、非规范的,你会马上得到答案


但希望有人能为你发几行代码!抱歉,我只有一分钟的时间回答。

当进程存在时,所有句柄都会自动关闭。如果这是清理的唯一原因,那么完全可以依赖ctrl-c.Read和
intro(2)
手册页。还可以阅读有关多路复用系统调用的内容,如
poll(2)
我也喜欢你答案中的解释,但我只能将其中一个标记为答案,而Joachim只是稍微击败了你。非常感谢,泰皮克@尼茨-别担心!