1. 非阻塞方式獲得輸入 scanf函數是以阻塞方式獲得輸入,沒有輸入時會一直等待,直到有輸入,scanf函數才執行完成。支持多方法多輸入的電子書希望以非阻塞形式獲得輸入。網上搜索stdin nonblock就能得到函數: 初始化就執行if語句: 退出非阻塞標準輸入,執行if else 語句: 初始 ...
1. 非阻塞方式獲得輸入
scanf函數是以阻塞方式獲得輸入,沒有輸入時會一直等待,直到有輸入,scanf函數才執行完成。支持多方法多輸入的電子書希望以非阻塞形式獲得輸入。網上搜索stdin 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 }
初始化就執行if語句:
struct termios ttystate; //get the terminal state tcgetattr(STDIN_FILENO, &ttystate); //turn off canonical mode ttystate.c_lflag &= ~ICANON; ttystate.c_cc[VMIN] = 1;//有一個數據時就立刻返回 //set the terminal attributes. tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
退出非阻塞標準輸入,執行if else 語句:
struct termios ttystate; tcgetattr(STDIN_FILENO, &ttystate); ttystate.c_lflag |= ICANON; tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
初始化之後判斷有沒有輸入:
struct timeval tv; fd_set fds; tv.tv_sec = 0; tv.tv_usec = 0; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0 select(STDIN_FILENO+1, &fds, NULL, NULL, &tv); return FD_ISSET(STDIN_FILENO, &fds);
return 為1則有輸入,進行操作,比如c = fgetc(stdin);
2. select函數
函數原型:int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
參數1:文件句柄+1
參數2,3,4,5:文件可讀/可寫/異常或者超時,函數返回
在linux終端輸入man select有詳細用法,裡面有example,可以參考
3. 查看cpu占用率
輸入telnetd -l /bin/sh
新建一個Sessions,host為開發板ip,相當於又打開了一個開發板的終端使用。
在新的終端輸入top就能查看cpu占用率了。
4. 多線程的使用
4.1 創建線程
pthread_create函數
4.2 取消線程
使用pthread_exit或者pthread_cancel,pthread_exit無法知道線程終止是否成功,而pthread_cancel取消線程成功返回0,失敗返回負值。
4.3 線程的使用
創建多個線程之後,要定義互斥鎖以及信號量:
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;
每個線程要獲得cpu的控制權就要獲取互斥鎖:
pthread_mutex_lock(&mutex); //獲取互斥鎖
然後對臨界數據進行操作,操作完之後發條件變數喚醒主線程
pthread_cond_signal(&condvar);
獲取互斥鎖用完之後記得釋放
pthread_mutex_unlock(&mutex);
主線程也要上鎖,等待子線程的條件變數喚醒它,最後也要釋放鎖
pthread_mutex_lock(&mutex); //獲取互斥鎖 pthread_cond_wait(&condvar,&mutex);
這裡就是主線程根據子線程反饋之後進行的操作。
pthread_mutex_unlock(&mutex);
5. make 出錯
雖然包含了頭文件<pthread.h>,但會出現pthread_create未定義的錯誤。需要在Makefile中添加pthread庫,-lpthread。