1.使用非阻塞方式獲取標準輸入

来源:http://www.cnblogs.com/Lwd-linux/archive/2016/12/25/6220891.html
-Advertisement-
Play Games

nonblock函數的原型如下: nonblock函數主要完成以下工作: a.從標準輸入獲取狀態,存放在ttystate中 b.關閉the canonical mode,通過置0的方式實現。 c.通過ttystate設置標準輸入的狀態。 kbhit函數的原型如下: 該函數主要通過timeval和se ...


//首先,我們先來看總的main函數框架
1
int main() 2 { 3 char c; 4 int i=0; 5 6 nonblock(NB_ENABLE); 7 while(!i) 8 { 9 usleep(1); 10 i=kbhit(); 11 if (i!=0) 12 { 13 c=fgetc(stdin); 14 if (c=='q') 15 i=1; 16 else 17 i=0; 18 } 19 20 fprintf(stderr,"%d ",i); 21 } 22 printf("\n you hit %c. \n",c); 23 nonblock(NB_DISABLE); 24 25 return 0; 26 }

nonblock函數的原型如下:

 1 void nonblock(int state)
 2 {
 3     struct termios ttystate;
 4  
 5     //get the terminal state
 6     tcgetattr(STDIN_FILENO, &ttystate);
 7  
 8     if (state==NB_ENABLE)
 9     {
10         //turn off canonical mode
11         ttystate.c_lflag &= ~ICANON;
12         //minimum of number input read.
13         ttystate.c_cc[VMIN] = 1;//有一個數據時就立刻返回
14     }
15     else if (state==NB_DISABLE)
16     {
17         //turn on canonical mode
18         ttystate.c_lflag |= ICANON;
19     }
20     //set the terminal attributes.
21     tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
22  
23 }

nonblock函數主要完成以下工作:

a.從標準輸入獲取狀態,存放在ttystate中

b.關閉the canonical mode,通過置0的方式實現。

c.通過ttystate設置標準輸入的狀態。

 

kbhit函數的原型如下:

 1 int kbhit()
 2 {
 3     struct timeval tv;
 4     fd_set fds;
 5     tv.tv_sec = 0;
 6     tv.tv_usec = 0;
 7     FD_ZERO(&fds);
 8     FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0
 9     select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
10     return FD_ISSET(STDIN_FILENO, &fds);
11 }

該函數主要通過timeval和select函數來實現的。select函數主要用於一些某些需要加工的多功能的I/O口中。如果不會使用select函數,可以查看《Unix高級編程》或者參考select函數的用法

kbhit函數主要完成的工作如下:

a.設置tv.tv_sec和tv.tv_usec為0,不等待,一直查詢埠。

b.FD的設置

c.調用select函數,Seems we are only interested in input, so we place out fd set at second parameter of select(), the 3rd is for output and 4th is for exception.

註意:如果user input被觸發,FD_ISSET將返回非0值,否則返回0;所以應該加如下的返回值判斷。

1 while(!kbhit())
2 {
3       //do certain operation..
4 }
5 //user hits enter.

Due to the canonical mode of your terminal, you need to hit enter to confirm your user input. Canonical mode means it always wait for enter to confirms the user input.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在之前的博文《Android中使用ViewPager實現屏幕頁面切換和引導頁效果實現》和《Android中Fragment的兩種創建方式》以及《Android中Fragment與Activity之間的交互(兩種實現方式)》中我們介紹了ViewPager以及Fragment各自的使用場景以及不同的實現 ...
  • 一、概述 運行時變更就是設備在運行時發生變化(例如屏幕旋轉、鍵盤可用性及語言)。發生這些變化,Android會重啟Activity,這時就需要保存activity的狀態及與activity相關的任務,以便恢復activity的狀態。 為此,google提供了三種解決方案: 下麵會逐一介紹三種情況,其 ...
  • 查詢這塊是重中之重, 關係到系統反應時間. 項目做到後期, 都是要做性能測試和性能優化的, 優化的時候, 資料庫這塊是一個大頭. sql格式: select 列名/* from 表名 where 條件 group by 列 having 條件 order by 列 asc/desc; 這裡牽涉到一個 ...
  • 在平常備庫和資料庫遷移的時候,當遇到大的資料庫的時候在用exp的時候往往是需要好幾個小時,耗費大量時間。oracle10g以後可以用expdp來導出資料庫花費的時間要遠小於exp花費的時間,而且文件也要小很多。 1.使用expdp要先在資料庫中創建directory,並給相應的用戶read,writ ...
  • 查詢內嵌文檔 數據準備 方式1:查詢整個內嵌文檔 與普通查詢完全相同。但是,如果要查詢一個完整的子文檔,那麼子文檔必須精確匹配(順序以及個數都要一樣)。 > db.blog.find({"comments":{"author":"lf","votes":20}}) > 方式2:只針對其鍵/值對進行查 ...
  • 數據準備 find find的第一個參數決定了要返回哪些文檔,用於指定查詢條件。要不指定查詢文檔,預設就是{},指定多個鍵/值對,相當於sql的and。第二個參數來指定想要的鍵(預設情況下,"_id"總是顯示)。 查詢條件 And查詢 使用AND型查詢時,應儘可能用最少的條件來限定結果的範圍。 當然 ...
  • I'm using ubuntu14 LTS. Problems: 1. When run roscore, got a mistake and an advice to ping the localhost. 2. Nearly every time I run a directive with ...
  • 遠程管理控制方式: RDP(remote desktop protocol)協議; telnet; SSH(Secure Shell); RFB(Remote FrameBuffer)協議(圖形化遠程管理協議) VNC伺服器:Linux下實現RFB協議的遠程管理軟體。 安裝:yum install ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...