使用非阻塞的IO应用程序常调用select类函数,允许进程决定是否可以对一个或多个打开的文件进行非阻塞的读取或者写入

该功能的实现就要下面tty_poll操作来实现的。该功能的函数实现有一个关键的数据结构poll_table和一个关键的函数poll_wait

对该结构和函数这里不深入解析只知道其功能即可

/**

* tty_poll - check tty status

* @filp: file being polled

* @wait: poll wait structures to update

*

* Call the line discipline polling method to obtain the poll

* status of the device.

*

* Locking: locks called line discipline but ldisc poll method

* may be re-entered freely by other callers.

*/

//tty_poll功能的实现主要在线路规程ldisc->poll中实现即normal_poll函数

static unsigned int tty_poll(struct file *filp, poll_table *wait)

{

struct tty_struct *tty;

struct tty_ldisc *ld;

int ret = 0;

tty = (struct tty_struct *)filp->private_data;

if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode, "tty_poll"))

return 0;

ld = tty_ldisc_ref_wait(tty);

if (ld->ops->poll)

ret = (ld->ops->poll)(tty, filp, wait); //调用normal_poll函数 tty_ldisc_deref(ld);

return ret;

}

poll方法的实现主要完成两步操作:

1)在一个或多个指示poll状态变化的等待队列上调用poll_wait.poll_wait增加一个等待队列到poll_table结构

如果没有可执行的文件IO则内核将进程在传递到该系统调用的所有文件描述符对应的等待队列上等待。

2)返回一个用来描述操作的是否可以立即执行的位掩码

/**

* normal_poll  - poll method for N_TTY

* @tty: terminal device

* @file: file accessing it

* @wait: poll table

*

* Called when the line discipline is asked to poll() for data or

* for special events. This code is not serialized with respect to

* other events save open/close.

*

* This code must be sure never to sleep through a hangup.

* Called without the kernel lock held - fine

*/

static unsigned int normal_poll(struct tty_struct *tty, struct file *file,

poll_table *wait)

{

unsigned int mask = 0;

poll_wait(file, &tty->read_wait, wait);  //增加一个等待队列到poll_table结构

poll_wait(file, &tty->write_wait, wait);

//POLLIN  设备可不阻塞地读

//POLLRDNORM  可以读"正常"数据. 一个可读的设备返回( POLLIN|POLLRDNORM ). if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty)))

mask |= POLLIN | POLLRDNORM;

//POLLPRI 可不阻塞地读取高优先级数据(带外).控制模式数据 if (tty->packet && tty->link->ctrl_status)

mask |= POLLPRI | POLLIN | POLLRDNORM;

//POLLHUP 当读这个设备的进程见到文件尾, 驱动必须设置POLLUP(hang-up). if (test_bit(TTY_OTHER_CLOSED, &tty->flags))

mask |= POLLHUP;

if (tty_hung_up_p(file))

mask |= POLLHUP;

//唤醒tty读的最小值设置 if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {

if (MIN_CHAR(tty) && !TIME_CHAR(tty))

tty->minimum_to_wake = MIN_CHAR(tty);

else

tty->minimum_to_wake = 1;

}

//POLLOUT 设备可被写入而不阻塞.

//POLLWRNORM 这个位和POLLOUT有相同的含义, 并且有时它确实是相同的数. 一个可写的设备返回( POLLOUT|POLLWRNORM). if (tty->ops->write && !tty_is_writelocked(tty) &&

tty_chars_in_buffer(tty) < WAKEUP_CHARS &&

tty_write_room(tty) > 0)

mask |= POLLOUT | POLLWRNORM;

return mask;

}

linux tty core code,linux tty core 源码分析(6)相关推荐

  1. Linux中mknod命令实现原理以及源码分析

    本篇文章以mknod创建字符设备文件进行讲解 字符设备驱动的Demo例子可参考该篇文章 Linux 编写简单驱动并测试 1. mknod 命令 mknod /dev/hello c 520 0 该命令 ...

  2. linux的can通信busoff,socketCAN内核源码分析是否支持busoff自恢复--Apple的学习笔记

    大总结:诊断小系统搭建步骤总结--Apple的学习笔记的剩余问题2中,我说过要深入下socketCAN内核源码学习.因为这个小项目关于驱动开发太顺利了,导致学习不到什么东东.最主要我一开始走了捷径,看 ...

  3. Linux项目实战C++轻量级Web服务器源码分析TinyWebServer

    目录 文章简介 一. 先跑起来项目 二.再看项目核心 三.逐个击破!立下flag 文章简介 TinyWebServer是Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的 ...

  4. 【分析笔记】Linux gpio_wdt.c 看门狗设备驱动源码分析

    基本原理 该看门狗的设备驱动实现原理很简单,比较主要的有两点: 一.定时器喂狗 通过定时器根据配置文件配置的喂狗方式(如脉冲切换.电平切换),对指定的 gpio 进行脉冲切换或电平切换实现喂狗. 脉冲 ...

  5. 字符设备-seria.c tty_io.c seria.c rs_io.s tty_iocnl.c tty.h termios.h keyboard.s源码分析

    这篇文章,很多语句我并没有给出注释,因为大都是宏定义.表格定义等语句,贴出来更多的是为了这一系列的完整性.   1 /*   2  *  linux/kernel/serial.c   3  *   ...

  6. 关于Asp.net core配置信息读取的源码分析梳理

    概述 我们都知道asp.net core配置信息的读取离不开IConfigurationSource和IConfigurationProvider这两个类,ConfigurationSource可以提 ...

  7. Linux下存储多路径软件MultiPath源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 全局概览 测试环境为CentOS 7 X64 从RPM获取源码 $ cd ~/rpmbuild/ $ yumdownloade ...

  8. 【Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )

    文章目录 一.do_mmap 函数执行流程 二.do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 & ...

  9. Linux设备驱动简析—PC重启源码分析

    Linux在PC上的关机和重启可能由两种行为引发,一是通过用户编程,一是系统自己产生的消息.用户和系统进行交互的方式也有两个,一个是系统调用:sys_reboot,另一个就是apm或acpi的设备文件 ...

  10. Linux PPP实现源码分析-1

    前言: PPP(Point to Point Protocol)协议是一种广泛使用的数据链路层协议,在国内广泛使用的宽带拨号协议PPPoE其基础就是PPP协议,此外和PPP相关的协议PPTP,L2TP ...

最新文章

  1. 应用域名改造-https证书部分
  2. 波卡链Substrate (3)SRML框架
  3. 车品觉 | 大数据的价值:找到别人的“集体智慧”
  4. centos 下载 哪个版本_生信分析平台搭建(十六):CentOS
  5. 20155327第三周学习总结
  6. lamp环境搭建经验总结
  7. tp连接mysql mysql_thinkphp学习简易教程(二) thinkphp连接读取MySQL数据库
  8. 计算机应用与软件是csci吗,计算机与信息技术学院
  9. arcgis字段计算器--随机数
  10. php多线程 static变量,private static和public static的比较:多线程间
  11. 自定义exchange由IMF导致的NDR信息
  12. 网络营销的关键你知道多少
  13. 为什么普通红包自己不能领_为什么行驶证和驾驶证不能放在车上?别给自己找麻烦...
  14. 计算机科学 院士 高校,快报!第5轮学科评估计算机科学与技术评委会名单,看有谁上榜了...
  15. 原码,反码,补码,全面解析
  16. java面试宝典2013
  17. 关于map与set的count的时间复杂度(个人观点,不正确请指出)
  18. 时间序列完全教程(R)
  19. FLASH中button组件的selected和toggle属性解析
  20. Git命令行操作详解

热门文章

  1. android设置背景渐变色,Android背景渐变色(shape,gradient)
  2. sqlserver创建函数后提示对象名无效
  3. 跳槽理由—你的跳槽理由合理吗
  4. python实现迷宫小游戏(附源码 简单易懂)
  5. java 反射 protected_通过Java反射机制访问private,protected变量和方法
  6. 天眼查、企查查APP的Authorized值和sign值破解思路记载
  7. chattr -i authorized_keys 无效
  8. 在本地运行scala程序报错 requirement failed: Can only call getServletHandlers on a running MetricsSystem
  9. Vim终极指南:所思即所得
  10. 苹果x人脸识别突然失灵_苹果官网维修进度显示下图“服务正在进行中”是代表诊断通过帮你维修手机了吗。...