当前位置:  开发笔记 > 编程语言 > 正文

如何在命令行界面中处理ctrl-break信号

如何解决《如何在命令行界面中处理ctrl-break信号》经验,为你挑选了2个好方法。

在开始之前,我想澄清一下,这不是一个命令行工具,而是一个通过它自己的命令行界面接受命令的应用程序.

编辑:我必须为我之前的解释道歉,显然我没有做好解释它的工作.再一次...

我正在构建一个接受用户命令的命令行界面应用程序.我有一个信号处理程序设置来捕获信号,然后设置我需要终止应用程序的标志.我遇到的问题是我能找到的所有控制台功能都是阻塞的,这意味着我无法检测到我需要退出控制台处理循环,直到用户按下某个键(或输入,具体取决于函数) ).

是否有一些标准的方法我可以做非块控制台交互,或者是否有一种优雅的方式来构造程序,这样如果我只是从信号线程终止,那么一切都将被正确处理和释放(请不要错误 - 理解这一点,我知道如何使用锁定和释放信令线程中的资源来实现这一点,但这可能会变得混乱,所以我宁愿避免它)

希望这个解释更有意义......



1> fizzer..:

好的 - 这对我在Windows上工作并且是可移植的 - 请注意#ifdef SIGBREAK - 这不是标准信号.

#include 
#include 
#include 
#include 
using namespace std;

namespace
{
    volatile sig_atomic_t quit;

    void signal_handler(int sig)
    {
        signal(sig, signal_handler);
        quit = 1;
    }
}

int main()
{
    signal(SIGINT, signal_handler);
    signal(SIGTERM, signal_handler);
#ifdef SIGBREAK
    signal(SIGBREAK, signal_handler);
#endif
    /* etc */

    while (!quit)
    {
        string s;
        cin >> s;
        cout << s << endl;
    }
    cout << "quit = " << quit << endl;
}



2> Adam Rosenfi..:

在*nix上,您可以使用该signal函数注册信号处理程序:

#include 

void signal_handler(int sig)
{
  // Handle the signal
}

int main(void)
{
  // Register the signal handler for the SIGINT signal (Ctrl+C)
  signal(SIGINT, signal_handler);
  ...
}

现在,只要有人按Ctrl + C,就会调用你的信号处理程序.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有