电子书笔记(二)
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);
初始化之后判断有没有输入(这是使用select监听):
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。