上一页 1 ··· 150 151 152 153 154 155 156 157 158 ··· 280 下一页
摘要: 单打开设备之外的下一步是使一个用户在多个进程中打开一个设备, 但是一次只允许一个 用户打开设备. 这个解决方案使得容易测试设备, 因为用户一次可从几个进程读写, 但是 假定这个用户负责维护在多次存取中的数据完整性. 这通过在 open 方法中添加检查来实 现; 这样的检查在通常的许可检查后进行, 并 阅读全文
posted @ 2019-07-06 10:46 樊伟胜 阅读(210) 评论(0) 推荐(0) 编辑
摘要: llseek 方法实现了 lseek 和 llseek 系统调用. 我们已经说了如果 llseek 方法从设备 的操作中缺失, 内核中的缺省的实现进行移位通过修改 filp->f_pos, 这是文件中的当前 读写位置. 请注意对于 lseek 系统调用要正确工作, 读和写方法必须配合, 通过使用和 阅读全文
posted @ 2019-07-06 10:45 樊伟胜 阅读(616) 评论(0) 推荐(0) 编辑
摘要: 提供存取控制的强力方式是只允许一个设备一次被一个进程打开(单次打开). 这个技术最 好是避免因为它限制了用户的灵活性. 一个用户可能想运行不同的进程在一个设备上, 一 个读状态信息而另一个写数据. 在某些情况下, 用户通过一个外壳脚本运行几个简单的程 序可做很多事情, 只要它们可并发存取设备. 换句 阅读全文
posted @ 2019-07-06 10:45 樊伟胜 阅读(385) 评论(0) 推荐(0) 编辑
摘要: poll 和 select 系统调用的真正实现是相当地简单, 对那些感兴趣于它如何工作的人; epoll 更加复杂一点但是建立在同样的机制上. 无论何时用户应用程序调用 poll, select, 或者 epoll_ctl,[24]24 内核调用这个系统调用所引用的所有文件的 poll 方法, 传递 阅读全文
posted @ 2019-07-06 10:43 樊伟胜 阅读(1658) 评论(0) 推荐(0) 编辑
摘要: 使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个 或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来 读或写. 因此 阅读全文
posted @ 2019-07-06 10:42 樊伟胜 阅读(879) 评论(0) 推荐(0) 编辑
摘要: 我们已经见到了 scullpipe 驱动如何实现阻塞 I/O. 如果你想试一试, 这个驱动的源码 可在剩下的本书例子中找到. 阻塞 I/O 的动作可通过打开 2 个窗口见到. 第一个可运行 一个命令诸如 cat /dev/scullpipe. 如果你接着, 在另一个窗口拷贝文件到 /dev/scul 阅读全文
posted @ 2019-07-06 10:41 樊伟胜 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 我们已经见到当一个进程调用 wake_up 在等待队列上, 所有的在这个队列上等待的进程 被置为可运行的. 在许多情况下, 这是正确的做法. 但是, 在别的情况下, 可能提前知道 只有一个被唤醒的进程将成功获得需要的资源, 并且其余的将简单地再次睡眠. 每个这样 的进程, 但是, 必须获得处理器, 阅读全文
posted @ 2019-07-06 10:40 樊伟胜 阅读(601) 评论(0) 推荐(0) 编辑
摘要: 我们已展现的唤醒进程的样子比内核中真正发生的要简单. 当进程被唤醒时产生的真正动 作是被位于等待队列入口项的一个函数控制的. 缺省的唤醒函数[22]22设置进程为可运行的 状态, 并且可能地进行一个上下文切换到有更高优先级进程. 设备驱动应当从不需要提供 一个不同的唤醒函数; 如果你例外, 关于如何 阅读全文
posted @ 2019-07-06 10:40 樊伟胜 阅读(2468) 评论(0) 推荐(0) 编辑
摘要: 在 Linux 内核的之前的版本, 正式的睡眠要求程序员手动处理所有上面的步骤. 它是一 个繁琐的过程, 包含相当多的易出错的样板式的代码. 程序员如果愿意还是可能用那种方 式手动睡眠; <linux/sched.h> 包含了所有需要的定义, 以及围绕例子的内核源码. 但是, 有一个更容易的方式. 阅读全文
posted @ 2019-07-06 10:39 樊伟胜 阅读(468) 评论(0) 推荐(0) 编辑
摘要: 如果我们深入 <linux/wait.h>, 你见到在 wait_queue_head_t 类型后面的数据结构是非 常简单的; 它包含一个自旋锁和一个链表. 这个链表是一个等待队列入口, 它被声明做 wait_queue_t. 这个结构包含关于睡眠进程的信息和它想怎样被唤醒. 使一个进程睡眠的第一步 阅读全文
posted @ 2019-07-06 10:38 樊伟胜 阅读(961) 评论(0) 推荐(0) 编辑
上一页 1 ··· 150 151 152 153 154 155 156 157 158 ··· 280 下一页