• select 以事件为单位组织文件描述符,
  • poll以文件描述符为单位组织事件
  • select的缺陷 监视的事件过于单一 ;发生假错绕一大圈 因为原因与结果同一空间

poll第一个参数结构体数组的起始位置,一个结构体一个文件描述符 int poll(struct pollfd *fds,nfds_t nfds,int timeout); timeout 毫秒为单位,0非阻塞,-1阻塞;

adv/poll short 类型 16位图 十六种事件最多 更详细的事件

#include<poll.h>
 
static void relay()
{
	struct pollfd pfd[2];
}
 
//放在循环外
pfd[0].fd=fd1;
pfd[1].fd=fd2;
while(fsm12.state!=STATE_T||fsm21.state !=STATE_T)
{
	//布置监视任务
	pfd[0].events = 0; //循环内清零 上一次事件
	if(fsm12.state == STATE_R)
		pfd[0].events |=POLLIN;
	if(fsm21.state == STATE_W)
		pfd[0].events |=POLLOUT;
 
	pfd[1].events=0;
	if(fsm12.state == STATE_W)
		pfd[1].events |= POLLOUT;
	if(fsm21.state == STATE_R)
		pfd[1].events |= POLLIN;
 
 
 
	//监视
	if(fsm12.state<STATE_AUTO || fsm21.state < STATE_AUTO)
	{
		while(poll(pfd,2,-1)<0)
		{
			if(errno == EINTR)
				continue; //绕小圈了
			perror(“poll()”);
			exit(1);
		}
	}
	//查看监视结果
	if(pfd[0].revents & POLLIN||pfd[1].revents &POLLOUT||fsm12.state > STATE_AUTO)
		 //如果一可读或者二可写
		fsm_driver(&fsm12);
	if(pfd[1].revents & POLLIN || pfd[0].revents &POLLOUT||fsm21.state>STATE_AUTO)
		fsm_driver(&fsm21);
}