select系统调用的使用

select系统调用与驱动程序当中的poll相对应.它可能会阻塞进程。select系统调用由驱动的poll方法实现。

1.select需要函的头文件:

    #include

2.select函数源型:

    int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout);

    maxfd - 文件描述符的范围,比待检测的最大文件描述符大1

    readfds - 被读监控的文件描述符集

    writefds - 被写监控的文件描述符集

    exceptfds - 被异常监控的文件描述符集

    timeout - 监控的超时时间。到时间后不再监控。函数返回

    返回值 - a.正常返回时,返回值为满足条件的文件描述符的个数

                    b.经过timeout等待后仍然无文件满足要求,返回0

                    c.如果select被某个信号中断,返回-1,并设置errno为EINTR

                    d.如果出错,返回-1,并设置errno为相应的值

3.select相关的宏定义:

    void FD_SET(int fd, fd_set *fdset); // 将文件描述符fd添加到文件描述符集合fdset中

    void FD_CLR(int fd, fd_set *fdset); // 从文件描述符集合fdset中清除文件描述符fd

    void FD_ZERO(fd_set *fdset); // 清空文件描述符集合fdset

    void FD_ISSET(int fd, fd_set *fdset); // 调用select后,测试是否fd满足监控条件

4.poll方法原型:

    unsigned int (*poll)(struct file *filp, poll_table *wait); 

5.poll设备方法的作用:

    a.使用poll_wait函数将等待队列添加到poll_table中

    b.返回描述设备是否可读或可写的掩码

    c.掩码:

                      POLLIN - 设备可读

                      POLLRDNORM - 数据可读

                      POLLOUT - 设备可写

                      POLLWRNORM - 数据可写

      设备可读通常返回( POLLIN | POLLRDNORM )

      设备可写通常返回( POLLOUT | POLLWRNORM )

      驱动中的poll方法并不会导致进程阻塞,它只是负责登记等待队列。阻塞发生在select()函数中的do_select()函数。

你可能感兴趣的:(linux学习)