【问题标题】:Doing operations in a while loop until a key combination is invoked c++在while循环中执行操作,直到调用组合键c ++
【发布时间】:2013-08-05 09:33:54
【问题描述】:

我有以下问题。我想在 Linux 终端中执行某些操作,直到调用组合键 CTRL+D。我找到了一个适用于 Windows 的 C++ 库函数可以做到这一点,但对于 Linux 来说没有简单的解决方案。代码骨架将是这样的:

while(!invoked){ //Until CTRL+D is pressed
//Do something
}
//Continue when CTRL+D is invoked

这可能吗?

【问题讨论】:

  • 我不确定 CTRL+D 是否会产生信号.. ?
  • 失败,它是 EOF。我的错。
  • 您是在谈论“在按下 CTRL-D 之前读取一些输入”,还是“画图和播放音乐”类型的“做某事”。对于 Giueseppe Pes 解决方案是否正确,或者我们应该走其他路线,区别非常重要。
  • 输入内容直到按下 CTRL-D,它并不比这更复杂 =)
  • @Nbr44 是否产生信号取决于最后一个stty。在Linux下,他总是可以调用tcsetattr让control D产生一个信号。 (更好的解决方案是在两个平台上都使用curses,而不必自己担心系统依赖。)

标签: c++ linux c++11 g++


【解决方案1】:

这会在插入组合“CRTL + D”时中断循环:

while ((c = getchar()) != EOF)

注意在 Linux 中 CRTL-D 代表 EOF。相当于windows中的CTRL-Z

【讨论】:

  • 如果用户不输入任何内容会怎样?
  • 应用程序在getchar()函数中被阻塞,等待输入。我明白你的意思了:D!问题是 getchar 函数调用了 BLOCKING read 系统调用。这可以通过使read 不阻塞并正确处理错误EAGAINEWOULDBLOCK 来解决。老实说,我从未尝试过STDIN,但它应该可以工作!
【解决方案2】:

等待Ctrl+D的最简单方法是从std::cin 中读取信息,然后在流中检查EOF。 问题是:这个调用会阻塞。所以 doing smth 应该发生在 其他一些 线程中。然后,您必须从服务员那里向那个工作线程发出信号(例如通过条件变量)...

【讨论】:

    【解决方案3】:

    使用 (n)curses 库中的 getch。正如 zaufi 已经解释的那样,在从标准输入读取时检查EOF,例如getchar,就像检查Ctrl-D,但它是一个阻塞操作。 getch 是非阻塞的(在nodelay 模式下),因此更适合诸如游戏之类的事情。

    【讨论】:

      猜你喜欢
      • 2013-03-22
      • 2020-09-19
      • 1970-01-01
      • 2020-05-17
      • 2021-12-11
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多