我们先来看一个使用信号驱动的例子,它通过signal(SIGIO, input_handler)对STDIN_FILENO启动信号机制,输入可获得时input_handler被调用,其源代码如下:
引用:#include
#include
#include
#include
#include
#include
#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);
}
为了使设备支持该机制,我们需要在驱动程序中实现fasync()函数,并在write()函数中当数据被写入时,调用kill_fasync()函数激发一个信号,此部分工作留给读者来完成。
引用:int pciex_fasync( int fd, struct file *filep, int on)
{
int val;
struct dev_private *pdev = filep->private_data;
val = fasync_helper(fd, filep, on, &pdev->fasync);
if(val < 0) return val;
return 0;
}
if(pdev->fasync){
kill_fasync(&pdev->fasync, SIGIO, POLL_IN);
}
lcw0428 于 2008-06-16 22:49:08发表:
不错!!!