概念
对于linux来说,异步和非阻塞是两个概念。可以概述如下
- 异步: 使得拥有文件指针的进程或者进程组能够立刻收到内核的SIGIO信号
- 非阻塞: 使得对于文件指针的读写操作不会阻塞于buffer为空的情况
区别及使用说明
ioctl和FIOASYNC等价于fcntl和O_ASYNC。
ioctl和FIONBIO等价于fcntl和O_NONBLOCK。
下面两个是等价的
1 2 3 4 |
|
FIOASYNC设置O_ASYNC标记,该标记决定fd可以IO时进程是否会收到SIGIO和SIGPOLL信号。
FIONBIO设置O_NONBLOCK标记,该标记会改变read,write和同类函数的行为,使得在fd还不能IO时立即返回而不是hang住。
后者经常跟select,poll等函数一起使用,使得主程序不会因为个别socket而影响其他。
一般来说使用select和poll结合非阻塞的文件指针可以对应大部分情况,但是某些时候 需要使用异步的文件指针。比如:如果一个函数处理数据,但是处理时间很长,在其处理的时候 我们需要运行这个函数的进程及时响应网络事件或者内核信号,这时就需要将其置为异步
对于socket来说,如果需要设置异步的话需要三个步骤
- 必须注册一个响应SIGIO的信号回调函数
- 通过fcntl设置F_SETOWN,使得socket属于某个进程
- 通过fcntl设置O——ASYNC将该socket设置为异步
非阻塞例子
设置非阻塞
1 2 3 4 |
|
网络非阻塞例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
注意
对于tcp的SIGIO来说,很多网络事件发送信号给相应的进程,所以在回调函数内需要进行区分