fdopen 函数,open可以重任何一个描述字创建一个标准i/o流
fdopen(int filders,const chat *mode); 将文件描述符转换为文件指针。
标准io的3类缓冲:
full buffering,只有在出现缓冲区满,进程显示调用fflush,或者进程调用exit终止自身,通常的大小是8192。
line buffering 只有在碰到换行符的时候,进程调用fflush或者调用exit函数来终止自身。
unbuffering,每次调用标准io函数输出函数都发生io。
标准io的规则:
标准错误输出总是不缓冲。
标准输入和标准输出完全缓冲,除非是终端设备。
所有的其他的io流都是完全缓冲,除非是终端设备。
/dev/poll接口:
使用步骤:
1:打开/dev/poll。
2:初始化一个pollfd结构。
3:调用write函数在/dev/poll设备上写这个结构数组一把它传递给内核。
struct dvpoll
{
struct pollfd *dp_fds;//指向一个缓冲区,在调用ioctl时返回时存放
//一个pollfd结构。
int dp_nfds;//缓冲区的大小;
int dp_timeout;//当为0的时候,就是非阻塞,但为-1的时候,没有
//设置超时。
};
struct pollfd
{
int fd;//描述字,sockfd,比如
short events;//request events to watch
short revents;//returned events witnessed
};
events:
POLLIN
有数据可读。
POLLRDNORM
有普通数据可读。
POLLRDBAND
有优先数据可读。
POLLPRI
有紧迫数据可读。
POLLOUT
写数据不会导致阻塞。
POLLWRNORM
写普通数据不会导致阻塞。
POLLWRBAND
写优先数据不会导致阻塞。
POLLMSG
SIGPOLL 消息可用。
此外,revents域中还可能返回下列事件:
POLLER
指定的文件描述符发生错误。
POLLHUP
指定的文件描述符挂起事件。
POLLNVAL
指定的文件描述符非法。
成功时,poll返回revents 域不为0的文件描述符的个数;如果超时前没有发生任何事件,poll返回0,失败返回-1,并设置errno为下列值之一:
一个或多个结构体中指定的文件描述符无效。
EFAULT
fds指针指向的地址超出进程的地址空间。
EINTR
请求的事件之前产生一个信号,调用可以重新发起。
EINVAL
nfds参数超出PLIMIT_NOFILE值。
ENOMEM
可用内存不足,无法完成请求。)