2012-12-10 50 views
1

我正在学习Linux内部。所以我遇到了poll系统调用。据我了解,当驱动程序使用某些数据准备好从设备读取数据并且我们有数据准备好设备时,驱动程序会使用它。在Linux驱动程序中调用系统调用

如果设备没有任何要读取的数据,当数据变为可用时,进程将进入休眠状态,反之亦然。

有人可以通过一些真实的例子为我提供调查系统调用的具体理解吗?

+1

我不确定这里有一个简单的例子。 W. Richard Stevens需要数十行代码来创建基于他的* Unix Network Programming *第1卷第6章中的“poll(2)”的简单TCP“echo”服务器的核心,并且他的代码是一个模型简单和清晰。这是我的建议:拿到那本书并阅读它。虽然'poll(2)'可以用于任何文件句柄,而不仅仅是网络套接字,它是最经常使用的地方,所以它是找到最佳解释的地方。 –

+0

[如何将轮询函数添加到内核模块代码?](https://stackoverflow.com/questions/30035776/how-to-add-poll-function-to-the-kernel-module-code) –

回答

1

轮询和选择(后者非常类似于轮询these区别)sys调用用于处理客户端请求的所谓异步事件驱动方法。

基本上,在网络编程有由服务器处理来自网络客户端的多个连接两大策略:

1)更传统的方式:螺纹或过程为导向的方法。在这种情况下,网络服务器具有监听特定网络端口(在Web服务器的情况下是端口80)的主要进程,用于传入连接,并且当连接到达时,它会产生新线程/进程来处理这个新连接。 Apache HTTP服务器采取了这种方式。

2)上述异步事件驱动方法,其中(最简单的情况下)网络服务器(例如web服务器)是仅有一个进程的应用程序,它接受连接(为每个新客户端创建套接字),然后监视这些套接字轮询/选择传入数据。 Nginx http web服务器采取了这种方式。

+1

回复:网络编程,你的答案意味着'select()'和'poll()'仅用于网络套接字。在Unix系统中,这些调用可以处理任何*文件句柄,而不仅仅是套接字。 –

+0

回复:过程结构的模型,在这里完全不相关;内核不关心。它也是一样,因为它是对可能的复杂性的一种手动处理,忽略了很多,基本上是错误的。它也被删除。 –

+0

回复:poll(2)与'select(2)',这些差异在Linux的内核级别是无关紧要的,因为它们使用相同的内核级机制来实现。 –