我正在使用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