11.c练习-高级IO

// 阻塞式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函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hehelot

感谢您的打赏!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值