hwa_super 发表于 2014-06-03 16:13

SIGUSR1使用的问题

我是要做个内核对用户的异步通知,在网上找了一下相关资料,照着写了一下发现一个奇怪的问题,

在用户态这边把信号类型定义为SIGUSR1就会出错,定义为SIGIO就不会,

而且无论我在内核发送哪个SIG,用户这边永远收到的是SIGIO,代码如下:

用户:
static sem_t            app_mutex;

void signal_handle(int signalnum)
{
    sem_wait(&app_mutex);

    printf("receive %d signal!\n",signalnum);//只要能收到信号,永远是SIGIO

    sem_post(&app_mutex);
}

int main(void)
{
    int fd,oflags;
    int error = 0;

    sem_init(&app_mutex,0,1);

    fd = open("/dev/ts0",O_RDWR,S_IRUSR|S_IWUSR);
    printf("open file fd = %d\n",fd);

    if(fd != -1)
    {
      //signal(SIGUSR1,signal_handle);//只打开SIGUSR1就会报错退出
      signal(SIGIO,signal_handle);//打开他就会收到信号
      error = fcntl(fd,F_SETOWN,getpid());
      printf("error = %d,fd = %d,pid =%d,SIGIO = %d\n",error,fd,getpid(),SIGUSR1);
      oflags = fcntl(fd,F_GETFL);
      error = fcntl(fd,F_SETFL,oflags|FASYNC);
      printf("error = %d fd = %d oflags %#x \n",error,fd,(oflags|FASYNC));

      while(1)
      {
            sleep(1);
            //printf("app run\n");
      }
    }
    else
    {
      printf("open file error\n");
    }
   
    return 0;
}

内核:

static int ts_file_fasync(int fd,struct file *filp,int mode)
{
        struct ts_dev *dev = filp->private_data;
    int error_code;

    /*add file to async list*/
        error_code = fasync_helper(fd,filp,mode,&(dev->async_queue));

    return error_code;
}

void ts_mode_change_callback(void)
{
    struct ts_dev *dev = platform_get_drvdata(&ts_device);
   
    if((dev->async_queue != NULL)&&(dev != NULL))
    {
      /*sent signal to app*/
      kill_fasync(&dev->async_queue,SIGUSR1,POLL_IN);//这里发送信号
    }   
}

//这是一个线程循环发信号
int signal_sent_task(void *ts_dev)
{
    while(1)
    {
      schedule_timeout(100000);
      ts_mode_change_callback();
      schedule_timeout(100000);
    }

    return 0;
}

hwa_super 发表于 2014-06-04 10:38

有没有人懂啊.
页: [1]
查看完整版本: SIGUSR1使用的问题