阻塞模式
是socket的缺省方式,也是最常用的方式,即函数阻塞直到调用完毕。可参见前面的例子。
可能造成阻塞的函数有:connect()、accept()、读写函数、select()、poll()、gethostbyname()等。
非阻塞模式
程序调用可能造成阻塞的函数时,如果会发生阻塞,这些函数返回-1并将errno设置为EAGAIN或EWOULDBLOCK,程序可继续向下运行。可能阻塞的函数对应的任务完成,则再次调用该函数时就返回0表示运行结束。
非阻塞模式可以避免程序死锁,但是需要程序不断检查各个可能阻塞的函数的状态,当一个应用程序使用了非阻塞模式的套接字,它需要使用一个循环来不听的测试是否一个文件描述符有数据可读(称做polling)。应用程序不停的polling内核来检查是否I/O操作已经就绪。这将是一个极浪费CPU资源的操作,因此不能实际应用。一般非阻塞模式是与同步I/O模式共同使用的。
进入非阻塞模式的方法,请参见函数说明
I/O多路复用(同步I/O模式)
使用select()、poll()等函数实现对多个socket的同步I/O操作。它能同时等待多个socket描述符,而这些socket描述符其中的任意一个进入读就绪/写就绪/出错状态,select()函数就可以返回。请参见函数说明和程序
信号驱动I/O
异步I/O