设备驱动中的异步通知
概念:
异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,
这一点非常类似于硬件上“中断”地概念,比较准确的称谓是“信号驱动(SIGIO)的异步 I/O”
实例:
我们先来看一个使用信号驱动的例子, 它通过signal(SIGIO, input_handler) 对 STDIN_FILENO 启动信号机制,
输入可触发 input_handler 被调用,其源代码如下:
/***************************************************************************************************
编译环境:未知
结 果:未编译
实 验 者:张 永 辉
***************************************************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define MAX_LEN 100
void input_handler(int num)
{
char data[MAX_LEN];
int len;
//读取并输出 STDIN_FILENO 上的输入
len = read(STDIN_FILENO, &data, MAX_LEN);
data[len] = 0;
printf("input available:%s\n", data);
}
main()
{
int oflags;
//启动信号驱动机制
signal(SIGIO, input_handler);
fcntl(STDIN_FILENO, F_SETOWN, getpid());
oflags = fcntl(STDIN_FILENO, F_GETFL);
fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);
//最后进入一个死循环,程序什么都不干了,只有信号能激发 input_handler 的运行
//如果程序中没有这个死循环,会立即执行完毕
while (1);
}