2018-08-01 (星期三)
poll():#includeint poll (struct pollfd *fd, unsigned int nfds, int timeout);struct pollfd { int fd; /* 文件描述符 */ short events; /* 所要查看的事件 */ short revents; /* 返回所目击的事件 */};
每个pollfd结构可用于指定一个要查看的文件描述符.
events字段:该文件描述符所要查看事件的位掩码.(位掩码是什么?)revents字段:该文件描述符所目击事件的位掩码,内核会在返回时设置此字段.events字段中所要求的事件可能会从revents字段返回.有效事件:POLLIN 有数据可供读取 POLLRDNORM 有一般数据可供读取 POLLRDBAND 有优先数据可供读取 POLLPRI 有紧急数据可供读取 POLLOUT 写入操作将不受阻挡 POLLWRNORM 写入一般数据将不受阻挡 POLLWRBAND 写入优先数据将不受到阻挡 POLLMSG 有SIGPOLL消息可用
此外,revents字段可能会返回下列事件:
POLLER 所指定的文件描述符发生错误 POLLHUP 所指定的文件描述符发生过去事件 POLLNVAL 所指定的文件描述符无效
EBADF 在一个过多个结构中指定了无效的文件描述符 EFAULT 指向fds的指针指向了进程地址空间以外的地方 EINVAL nfds参数设定超过了RLIMIT_NOFILE的限制 ENOMEM内存怒不足以完成这项要求
#include#include #include #define TIMEOUT 5 /* poll 的等待时间,以秒为单位 */int main(void) { struct pollfd fds[2]; int ret; /* 查看stdin的输入 */ fds[0].fd = STDIN_FILENO; fds[0].events = POLLIN; /* 查看stdout是否可供写入(通常可以) */ fds[1].fd = STDOUT_FILENO; fds[1].events = POLLOUT; /* 都设定好了,开始提供服务! */ ret = poll (fds, 2, TIMEOUT * 100); if (ret == -1) { perror ("poll"); return 1; } if (!ret) { printf ("%d seconds elapsed.\n", TIMEOUT); return 0; } if (fds[0].revents & POLLIN) { printf ("stdin is readable\n"); } if (fds[1].revents & POLLOUT) { printf("stdout is writable\n"); } return 0;}