zoukankan      html  css  js  c++  java
  • 电子书笔记(二)

    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。

  • 相关阅读:
    grep命令、sed 命令 、awk命令、uniq命令
    正则表达式学习(python之re模块)
    linux目录结构
    shell之find命令详解
    shell之 ps、kill、killall命令详解
    linux用户及权限
    C#中数据类型char*,const char*和string的三者转换
    C#中通过SendARP读取MAC地址
    C#对字典Dictionary 的添加,遍历,移除系列操作
    CMD命令行实现复制一张图片1000份:
  • 原文地址:https://www.cnblogs.com/zhu-g5may/p/9329857.html
Copyright © 2011-2022 走看看