我正在使用while循环,它不终止,用于使用C代码重新生成unix的尾部命令。我需要一种方法来停止Ctrl + C之外的循环,这会退出我相信的过程。在代码中使用时是否有任何方法可以读取键盘命令?使用getchar()的问题是,它会阻止循环运行,直到输入一个字符。这个问题有其他解决方案吗?在循环中读取停止信号
0
A
回答
2
您需要关闭阻塞和行缓冲。关闭阻挡,因此getc()
立即返回。它会返回-1,直到它有一个真实的字符。关闭行缓冲,以便操作系统立即发送字符,而不是缓冲它,直到您按下回车时出现全行。
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <termios.h> /* POSIX terminal control definitions */
int main(void) {
// Turn off blocking
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
struct termios options, oldoptions;
tcgetattr(STDIN_FILENO, &options);
// Disable line buffering
options.c_lflag &= ~(ICANON);
// Set the new options for the port...
tcsetattr(STDIN_FILENO, TCSANOW, &options);
while(1) {
char c = getc(stdin);
if(c != -1) break;
}
// Make sure you restore the options otherwise you terminal will be messed up when you exit
tcsetattr(STDIN_FILENO, TCSANOW, &oldoptions);
return 0;
}
我同意,你应该使用signals
其他海报,但是这是回答你的要求。
0
这听起来很像this question from the comp.lang.c FAQ。
问:如何在不等待RETURN键的情况下从键盘读取单个字符?如何禁止字符在键入时在屏幕上回显?
相关问题
- 1. 循环,读取后停止一个记录与GUI(不循环)
- 2. 在java中停止循环
- 3. 停止循环
- 4. 停止循环
- 5. 如何从循环中停止的地方读取数据?
- 6. 循环中的jQuery getJson在n个循环后停止循环
- 7. 从循环中停止javascript
- 8. 停止AVPlayer循环
- 9. Exoplayer停止循环
- 10. 停止for循环
- 11. 停止DLL循环
- 12. 停止循环C#?
- 13. 停止循环VB.NET
- 14. 停止循环Python
- 15. 在C,linux中,关于终止信号和睡眠()循环中
- 16. 在循环中读取EEPROM
- 17. 如何从文本文件读取时停止foreach()循环?
- 18. 如何让程序读取回车键并停止循环?
- 19. 从循环外停止jQuery setInterval循环
- 20. For循环停止1循环后
- 21. 如果循环不会停止循环
- 22. while循环不会停止循环Java
- 23. 在方法中停止递归循环
- 24. 在java中停止循环声音
- 25. 在WSO2中停止循环ESB
- 26. 在Python中停止For循环
- 27. 停止在J2ME中循环的声音
- 28. 在中途停止while循环 - Python
- 29. iMacros在循环中随机停止
- 30. 如何停止在Android中循环gif
您确定要让程序互动吗?请参阅http://fmg-www.cs.ucla.edu/geoff/interfaces.html#interactive –
您可以简单地捕获ctrl-c(sigint)。 – Macmade
你应该阅读关于Unix信号处理....从[this](http://www.yolinux.com/TUTORIALS/C++Signals.html)得到一个想法 – shan