免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2023 | 回复: 1

[驱动] SIGUSR1使用的问题 [复制链接]

论坛徽章:
0
发表于 2014-06-03 16:13 |显示全部楼层
我是要做个内核对用户的异步通知,在网上找了一下相关资料,照着写了一下发现一个奇怪的问题,

在用户态这边把信号类型定义为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;
}

论坛徽章:
0
发表于 2014-06-04 10:38 |显示全部楼层
有没有人懂啊.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP