高级轮询技术-poll

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
    可用内存不足,无法完成请求。)

你可能感兴趣的:(struct,IO,终端,events)