6. 文件IO模型的实现 ---阻塞 和 非阻塞

概念
   1. 阻塞:当需要获取某个资源的时候,如果资源不可达,那么进程就会休眠       
     (让出调度权), 如果数据可达,进程就会被唤醒 

   2. linux大部分的函数默认都是休眠, 实际是需要驱动支持(降低CPU占用)
      如: scanf(); accept(),  read(); readfrom...         

a. 实现阻塞

wait_queue_head_t wq_head;   //声明一个变量;

1. 初始化等待队列头( __init )
    init_waitqueue_head(wait_queue_head_t *q); //原型

2. 在某个特定的地方 ( xxx_irq( ))进行休眠(中断产生时)
   //内部中会构建一个对待队列项(节点--wait_queue_t),加入到等待队里头中
    wake_up_interruptible(wait_queue_head_t *q )

    并使  condition = 1 ;

3. 在某个特定的地方(xxx_read ())唤醒

       wait_event_interruptible(wait_queue_head_t wq,  int condition)
       参数1:等待队列头对象
       参数2:表示条件,条件为假,就会休眠,为真不会休眠




b. 非阻塞:

思想:当有资源的时候,给资源,没有资源给错误码
应用设置成阻塞:
    open("/dev/key1", O_RDWR|O_NONBLOCK);
    read();
-------------------------------------------------------
驱动:区分阻塞和非阻塞
     if((filp->f_flags & O_NONBLOCK ) &&  !key_dev->have_data)
     {
        return -EAGAIN;
     }

修改环境变量:

    应用程序设置非阻塞:
    fd = open("/dev/key1", O_RDWR);
    fd = socket(AF_INET, SOCK_STREAM, 0);

    //打开之后需要修改原来flag
    int flags = fcntl(fd, F_GETFL, NULL);
    flags |= O_NONBLOCK;
    fcntl(fd, F_SETFL, flags);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值