// 阻塞式IO(内核默认) wait\pause\sleep…read、write文件等情况
// 非阻塞IO O_NONBLOCK打开文件 或fcntl设置非阻塞标志
// IO多路复用 IO multiplexing 用在需要多路 非阻塞式(外部表现阻塞式,内部实际是非阻塞式自动轮询的)select poll都是IO多路复用函数
// 异步IO:系统软件实现的中断响应,注册一个信号处理
// IO的O_ASYNC设置当前文件描述符接收信号(异步通知)
// F_SETOWN设置当前进程接收信号
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>
#define DEBUG //DEBUG时需要打开
#ifndef DEBUG
#define dbg(format, ...) while(0)
#else
#define dbg(format, ...) printf(format, ##__VA_ARGS__)
#endif
// 阻塞式IO(内核默认) wait\pause\sleep...read、write文件等情况
// 非阻塞IO O_NONBLOCK打开文件 或fcntl设置非阻塞标志
/*
int main(void)
{
int fdm =-1;//定义鼠标文件描述符
char buf[20]={0};
int flag = -1;
fdm = open("/dev/input/mouse0", O_RDONLY|O_NONBLOCK);
if(fdm < 0)
{
perror("error: open mouse0");
exit(-1);
}
// 设置键盘非阻塞
flag = fcntl(0, F_GETFL);
flag |= O_NONBLOCK;
fcntl(0, F_SETFL);
while (1)
{
flag = read(fdm, buf, 10);
if(flag > 0)
{
printf("鼠标:%s\n",buf);
}
memset(buf, 0, sizeof(buf));
flag = read(0, buf, 5);
if(flag > 0)
{
printf("键盘:%s\n",buf);
}
memset(buf, 0, sizeof(buf));
}
return 0;
}
*/
// IO多路复用 IO multiplexing 用在需要多路 非阻塞式(外部表现阻塞式,内部实际是非阻塞式自动轮询的)
// select poll都是IO多路复用函数
/*
int main(void)//select函数
{
char buf[20]={0};
int fdm = -1;
fdm = open("/dev/input/mouse0", O_RDONLY);
if(fdm < 0)
{
perror("error open mouse0");
exit(0);
}
struct timeval out_val={0};
out_val.tv_sec = 10;
int ret = -1;
fd_set read_fds;
FD_ZERO(&read_fds);
FD_SET(0, &read_fds);
FD_SET(fdm, &read_fds);
while (1)
{
ret = select(fdm+1, &read_fds,NULL, NULL,&out_val);
// 这里之后out_val会被改变,应再次赋值
out_val.tv_sec = 10;
if(0 > ret)//内部错误
{
perror("select is error");
exit(-1);
}
if(0 == ret)//返回超时
{
printf("select is timeout\n");
}
if(0 < ret)//
{
memset(buf, 0, sizeof(buf));
dbg("at select 93,ret is [%d]\n",ret);
if(FD_ISSET(0,&read_fds))//键盘
{
read(0, buf, 10);
printf("键盘:%s\n",buf);
}
if(FD_ISSET(fdm,&read_fds))//鼠标
{
read(fdm, buf, 5);
printf("鼠标:%s\n",buf);
}
// 再次设置read_fds,如果不设置,那么第一次鼠标以后就之后读鼠标...第一次键盘..
FD_SET(0, &read_fds);
FD_SET(fdm, &read_fds);
}
}
return 0;
}*/
// poll函数 (未写)
// 异步IO:系统软件实现的中断响应,注册一个信号处理
// IO的O_ASYNC设置当前文件描述符接收信号(异步通知)
// F_SETOWN设置当前进程接收信号
int fdm =-1;//定义鼠标文件描述符
void mouse_even(int sig)
{
char buf[20]={0};
memset(buf, 0, sizeof(buf));
if(SIGIO==sig)
{
dbg("at signal\n");
read(fdm, buf, 5);
printf("鼠标:%s\n",buf);
}
}
int main(void)
{
char buf[20]={0};
int flag = -1;
int ret = 0;
fdm = open("/dev/input/mouse0", O_RDONLY);
if(fdm < 0)
{
perror("error: open mouse0");
exit(-1);
}
flag = fcntl(fdm,F_GETFL);
flag |= O_ASYNC;//设置鼠标文件描述符为可接受异步IO
fcntl(fdm, F_SETFL, flag);
fcntl(fdm, F_SETOWN,getpid());//设置异步IO事件为当前进程
signal(SIGIO, mouse_even);//注册信号
while(1)
{
memset(buf, 0, sizeof(buf));
// dbg("at while\n");
ret = read(0, buf, 10);
if(ret >0)
printf("键盘:%s\n",buf);
}
}
// 存储映射IO mmap函数