- 查询方式:非阻塞
- 在app调用open的时候,使用O_RDWR|O_NONBLOCK
- 阻塞方式
- 在app调用open的时候,使用O_RDWR,不传入O_NONBLOCK,
- 当驱动程序有数据时,read函数就会返回数据
- 负责APP将在内核态休眠,直至有数据时被内核态唤醒
-
poll 方式
pfd.fd = fd; pfd.events = POLLIN; pfd.revents = 0;while (1){ret = poll(&pfd,nfds,5000); if(ret > 0){if(pfd.events == POLLIN){while((read(fd,&event,sizeof(event)) == sizeof(event))){printf("Event: type=%d code=%d value=%d\n", event.type, event.code, event.value);}}}else if( ret == 0){printf("time out \n");}}
- 异步通知(select)
void my_signal_cb(int num)
{struct input_event event;while((read(fd,&event,sizeof(event))== sizeof(event))){printf("Event: type=%d code=%d value=%d\n", event.type, event.code, event.value);}
}
signal(SIGIO, my_signal_cb);fd = open(argv[1], O_RDWR | O_NONBLOCK);
if (fd < 0)
{printf("open %s err\n", argv[1]);return -1;
}
fcntl(fd, F_SETOWN, getpid());
flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | FASYNC);while(1)
{
}