日期:2014-05-16  浏览次数:21254 次

【求助】文件open函数打开时的O_NONBLOCK 什么意思
【求助】文件open函数打开时的O_NONBLOCK 什么意思啊,
另外,fcntl 是否操作的必须是 fopen 打开的文件 ;ioctl 操作的是 open 函数打开的文件 ,能不能相互的操作,比如:fcntl 操作由 open 函数打开的文件 ;
也许很基本的 ,刚开始学 驱动程序 的编写,产生了一些疑问,感觉有点乱,
先谢谢了
O(∩_∩)O~

------解决方案--------------------
apue说到非堵塞要分析两种系统调用,低速的系统调用和其它的系统调用。那么低速的系统调用可能是进程堵塞。例如对不存在的数据进行读操作,可能是调用者永远阻塞,因为他得等读到了数据才返回;如果某个文件描述符拒绝某个写操作,写操作不能完成而阻塞;打开某些类型没有准备好的文件的文件也会引起阻塞;以及对强制性记录锁读或写;某些ioctl操作;某些进程间的通信。
非阻塞I/O使我们的操作要么成功,要么立即返回错误,不被阻塞。
对于一个给定的描述符两种方法对其指定非阻塞I/O:
(1)调用open获得描述符,并指定O_NONBLOCK标志
(2)对已经打开的文件描述符,调用fcntl,打开O_NONBLOCK文件状态标志。
int flags,s为描述符
C/C++ code

flags = fcntl( s, F_GETFL, 0 ) )
fcntl( s, F_SETFL, flags | O_NONBLOCK )

------解决方案--------------------
在内核中是,检测其标志!如果存在O_NONBLOCK,读写操作将会立即返回,否则内核通过调度其它进程阻塞当前进程!当目的事件发生时内核会唤醒它!
------解决方案--------------------
fcntl可用open函数打开的文件句柄。