在Linux中,如果想要采用中断程序,则需要修改驱动, 方便起见,使用select/poll机制进行相应
select和poll在使用时,都会自动挂起当前进程,当响应条件达成时,根据返回值来判断是哪一种响应,作出相应的操作。
int select (int n, fd_set *readfds, fd_set *writefds, fd_set*exceptfds, struct timeval *timeout);
select可以监视三种文件描述符,分别为writefds,readfds,exceptfds,还有一种是超时。当select返回是,通过遍历这几种文件描述符(或超时),来判断是哪种响应,并进行相关操作
int poll (struct pollfd *fds, unsigned int nfds, inttimeout);
poll可以监视的有很多种,并且一样也有超时操作,与select相似
关于poll监视的文件描述符宏定义如下:
#define POLLIN 0x0001 //普通或优先级带数据可读
#define POLLPRI 0x0002 //高优先级数据可读
#define POLLOUT 0x0004 //普通数据可写
#define POLLERR 0x0008 //发生错误
#define POLLHUP 0x0010 //发生挂起
#define POLLNVAL 0x0020 //描述字不是一个打开的文件
#define POLLRDNORM 0x0040 //普通数据可读
#define POLLRDBAND 0x0080 //优先级带数据可读
#define POLLWRNORM 0x0100 //普通数据可写
#define POLLWRBAND 0x0200 //优先级带数据可写
#define POLLMSG 0x0400 //消息可用
关于poll的部分例程如下:
intfd;
if((fd=open_port(fd,3))<0){
printf("open_port error");
return;
}
if((i=set_opt(fd,9600,8,'N',1))<0){
printf("set_opt error");
return;
}
int nread = 0;
int ret;
struct pollfd event;
char readBuf[10];
memset(readBuf, 0, 10);
memset(&event,0,sizeof(event));
event.fd = fd;
event.events = POLLIN;
ret=poll((struct pollfd *)&event,1,50);
if(ret<0){
printf("poll error!\n");
exit(1);
}
if(ret==0){
printf("Time out!\n");
}
if(event.revents&POLLERR){
printf("Device error!\n");
exit(1);
}
if(event.revents&POLLIN){
nread = read(fd,readBuf,10);
printf("nread =%d,%s\n",nread,readBuf);
}
在执行ret=poll((structpollfd *)&event,1,50);这句之后,这个进程会自动挂起,直到POLLIN被触发,或者超时50ms之后,运行接下来的语句