概述
- 在io操作上设置超时三种方法
- read和write这俩个函数的三个变体
- recv和send允许通过第四个参数从进程到内核传递标志
- readv和writev允许指定往其中输入数据或从其中输出数据的缓冲区向量
- recvmsg和sendmsg结合了其它io函数的所有特性,具备接收和发送辅助数据的新能力
套接字超时
在io操作上设置超时三种方法
- 调用alarm,它在指定超时期满时产生SIGALRM信号。
- 在select种阻塞等待io
- 使用SO_RCVTIMEO和SO_SNDTIMEO套接字选项
recv和send函数
注:若一个进程需要由内核更新标志,它就必须调用recvmsg而不是调用recv或者recvfrom
#include <sys/socket.h>
ssize_t recv(int sockfd,void * buff,size_t nbytes,int flags);
ssize_t send(int sockfd,const void* buff,size_t nbytes,int flags);
返回:若成功则为读入或写出的字节数,若出错则为-1
排队的数据量
获悉已排队的数据量
- 目的在于避免读操作阻塞在内核中,可以使用非阻塞io
- 既想查看数据,又想数据仍然留在接收队列中供进程读取可以使用MSG_PEEK
- 一些实现支持ioctl的FIONREAD命令
标准IO函数库的三类缓冲
- 完全缓冲:缓冲区满,进程显式调用fflush或者调用exit终止自身才发生io,标准io缓冲区通常大小为8192字节
- 行缓冲:碰到一个换行符,进程显式调用flush或调用exit终止自身
- 不缓冲:每次调用标准io输出函数都发生io
标准io函数库的大多数Unix实现使用如下限制
标准错误输出总是不缓冲
标准输入和标准输出完全缓冲,除非它们指代终端设备(行缓冲)
所有其它io流都是完全缓冲,除非它们指代终端设备(行缓冲)