阻塞模式与非阻塞模式

来源:互联网 发布:制作微视频的软件 编辑:程序博客网 时间:2024/05/21 16:12

这两天在看一个FTP客户端的代码,里面用到了socket的非阻塞模式。之前没有接触个这方面。看了下APUE,里面只是简单说了下,这个是文件状态标志。。在linux下什么都是以文件形式存在的,设备也是。访问设备可以通过文件描述符来访问。刚开始我还以为,一个文件设置个非阻塞模式或是阻塞模式干什么用,难道阻塞模式就打开文件,什么都不干,干等着阿。。于是我谷歌。发现只有在设备和网络使用阻塞和非阻塞模式。正好我就是看FTP客户端代码,这个是网络的。很多都说非阻塞模式就是立即返回,阻塞模式就是等待。在设备上用的时候,用非阻塞模式可以立即返回,这样在多个设备上操作的时候,不用等待某个设备,立即返回访问别的设备。我就疑惑了,那个FTP客户端是单进程的阿,又没有别的套接字了,那阻塞和不阻塞有什么区别,为什么要用阿。于是找书再谷歌~~。才发现read,revc,connect等函数都是会使socket阻塞的,那阻塞就阻塞了,不是要等到这些函数有数据返回才好进行下一步么。再看书,看 《unix网络编程》里面的非阻塞IO部分,里面说,在阻塞模式下,read函数必须要到有数据读才回返回,如果没有数据返回那就一直等待,这样会浪费很多时间。想想也是阿,还有connect函数,要进行三路握手。不是一connect就能立即连上,在返回的过程中要等待,时间可长可短。如果一直干等着就会浪费掉时间,这个时候如果用非阻塞模式的话,就能在等待connect返回的时候干掉别的事。。我用connect做了个实验

 

 

结果是:

cczp@cczp-desktop:~/programs/socket$ ./noblockFtp 192.168.0.155 21
no connect~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nonononononononnoonononooo
connecteddddddddddddddddddddddddddd

 

在等待connect成功返回的时候,connect语句下面的语句被执行了,如果不是阻塞模式,那么一直等到connect成功返回才会执行,就上面的代码来说,就算connect成功返回,connect下面的语句也不会执行,仅执行done: 的语句。。

 

原创粉丝点击