电子书笔记(二)

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。

 

posted @ 2018-07-20 20:48  一条水煮鱼  阅读(223)  评论(0编辑  收藏  举报