异步通知

先写一个测试函数:

#include <stdio.h>

#include <signal.h>    //signal函数的需要

 

 

设置信号处理函数!!!用signal1.

void  my_signal_fun(int  signum)

{

  static  int  cnt = 0;

  printf("signal = %d,  %d  times\n",  signum,  ++cnt)

}

 作用:打印信号。

int main(int  argc,  char  **argv)

{

  signal(SIGUSR1,  my_signal_fun);

信号和中断差不多,需要注册

  while(1)

  {

    sleep(1000);

  }

}

 

可以用kil命令来发送信号,需要明确进程号,即PID数值。

kill -USR1  833  USR1 = 10

kill -10  833

kil  -9  833  默认退出

 

要点:

  1.注册信号处理函数

  2.发送信号,kill -10  833

 

目标:

按下按键时,驱动程序通知应用程序

  1.应用程序要注册信号处理函数

  2.确定谁发信号(驱动)

  3.发给谁(应用),应用程序告诉内核自己的PID!

  4.怎么发?驱动调用某个函数发送。kill_fasyn

 

实施:在中断程序中发送数据

 先定义一个结构体:

  static  struct  fasync_struct  *button_async;

  

 在中断程序wake_up下面再加上:

  kill_fasync(&button_async,  SIGIO,  POLL_IN);

 

 建立新的fileoperation结构体L:

 static  struct  file_operations  fifth_drv_fops =  {

  .owner   =  THIS_MODULE,

  .open  =  fifth_drv_open;

  .read  =  fifth_drv_read,

  .release  =  fifth_drv_release,

  .poll  =  fifth_drv_poll,   

  .fasync =  fifth_drv_fasync

};

 

 新建相应的处理函数:

static  int  fifth_drv_fasync(int  fd,  struct  file  *filp,  int  on)

{

  return  fasync_helper(fd,  filp,  on,  &button_async);

}

 

 通过F_SETTOWN命令,调用fcntl(fd,F_SETDOWN,pid)应用程序调用这个函数来告诉驱动自己的PID。

 

应用程序读出flag,并修改之。

 

Oflags = fcntl(fd,  F_GETFL);

 

fcntl(fd,  F_SETFL,  oflags  |  FASYNC);

 

fasync_helper函数用于初始化结构体,

 

 新的main函数:

 

void  my_signal_fun(int  signum)

{

  unsigned char key_val;

  read(fd,&key_val,1);

  printf("key_val:0x%x\n",key_val);

}

 

 

int main(int argc,  char  **argc)

{

  unsigned char key_val;

  int ret;

 

  signal(SIGIO,my_signal_fun);    //信号处理函数

 

  fd = open("/dev/buttons",O_RDWR);

  if(fd < 0)

  {

    printf("can't  open!\n");

  }

  fcntl(fd,  F_SETOWN,  getpid())

  Oflags  =  fcntl(fd, F_GETFL);

  fcntl(fd,  F_SETFL,  Oflags  |  FASYNC);

 

 

  while(1)

  {

    sleep(1000);

  }

}

 

posted @ 2017-10-15 16:18  梦提三尺剑  阅读(203)  评论(0编辑  收藏  举报