免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9971 | 回复: 13
打印 上一主题 下一主题

内核层与用户层信号异步通知问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-05 09:46 |只看该作者 |倒序浏览
内核层与用户层信号异步通知一定要用SIGIO信号吗
若是 步骤如下:
1 A device driver 检测GPIO A通过SIGIO通知用户层
2 B device driver 检测GPIO B也通过SIGIO通知用户层
3 用户进程C 先打开device A 注册信号SIGIO信号handle handle_A
然后进程C 再打开deviceB 注册信号SIGIO信号handle handle_B
那么问题来了, 在同一个进程内不可能有2个相同的信号handle. 那么一个进程需要接受2个device的异步通信如何实现呢?
同时, 如果要用其他信号如SIGUSR1那些信号,如何从内核层通知到用户层呢?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-11-05 10:11 |只看该作者
原帖由 studyboy_3w 于 2008-11-5 09:46 发表
内核层与用户层信号异步通知一定要用SIGIO信号吗
若是 步骤如下:
1 A device driver 检测GPIO A通过SIGIO通知用户层
2 B device driver 检测GPIO B也通过SIGIO通知用户层
3 用户进程C 先打开device A 注册信 ...


看一下ldd3第169页异步通知的说明:
“为了启用文件异步通知机制,用户程序必须执行两个步骤。首先,他们指定一个进程作为文件的“属主(owner)”。当进程使用fcntl系统调用执行F_SETOWN命令时,属主进程的进程ID号就被保存在filp->f_owner中。这一步是必须的,目的是为了让内核知道应该通知哪个进程。……”

我想你不会把一个driver异步通知到多个进程吧,如果是这样,我想就比较麻烦了。

论坛徽章:
0
3 [报告]
发表于 2008-11-05 10:30 |只看该作者
关于内核事件层,网上讨论比较少? 有谁比较熟悉的? 能大概简述一下吗?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-11-05 10:34 |只看该作者
原帖由 studyboy_3w 于 2008-11-5 10:30 发表
关于内核事件层,网上讨论比较少? 有谁比较熟悉的? 能大概简述一下吗?


不太清楚你说的内核事件层指的是什么?
是说异步通知是怎样执行的?

论坛徽章:
0
5 [报告]
发表于 2008-11-05 10:43 |只看该作者
对. 主要是问内核层如何通知到应用层. 可以是异步通知.   关于内核层,只是我刚才在baidu搜到有介绍而已,想进一步了解一下.

论坛徽章:
0
6 [报告]
发表于 2008-11-05 10:46 |只看该作者
原帖由 dreamice 于 2008-11-5 10:11 发表


看一下ldd3第169页异步通知的说明:
“为了启用文件异步通知机制,用户程序必须执行两个步骤。首先,他们指定一个进程作为文件的“属主(owner)”。当进程使用fcntl系统调用执行F_SETOWN命令时,属主进程 ...


我的问题并非一个driver异步通知多个进程, 而是一个进程接受多个driver的异步通知问题.


当然也可以讨论一下 "一个driver异步通知多个进程该如何实现?"

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2008-11-05 10:57 |只看该作者
原帖由 studyboy_3w 于 2008-11-5 10:46 发表


我的问题并非一个driver异步通知多个进程, 而是一个进程接受多个driver的异步通知问题.


当然也可以讨论一下 "一个driver异步通知多个进程该如何实现?"


1、一个进程接受多个driver的通知的问题:
应用程序借助select或poll来确定输入的来源。

2、一个driver通知多个进程的问题:
多个进程如果是进程组,那可以直接通知这个进程组。如果不是同一个进程组,这个问题可能用等待队列实现比较好。

[ 本帖最后由 dreamice 于 2008-11-5 11:01 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2008-11-05 11:03 |只看该作者
原帖由 studyboy_3w 于 2008-11-5 10:43 发表
对. 主要是问内核层如何通知到应用层. 可以是异步通知.   关于内核层,只是我刚才在baidu搜到有介绍而已,想进一步了解一下.



你看一下我贴的那个宋老师讲座的PPT帖子,PPT上有一幅图,描述得很形象,至于具体的实现,我想得结合理论知识并通过看代码来深入理解。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
9 [报告]
发表于 2008-11-05 11:26 |只看该作者
我查了一下,至于多个进程都需要异步通知的情况,各自注册为异步通知就可以了,当数据到达时,所有进程都将被通知到。

论坛徽章:
0
10 [报告]
发表于 2008-11-05 12:05 |只看该作者
原帖由 dreamice 于 2008-11-5 11:03 发表



你看一下我贴的那个宋老师讲座的PPT帖子,PPT上有一幅图,描述得很形象,至于具体的实现,我想得结合理论知识并通过看代码来深入理解。



是吗? 地址是?



"我查了一下,至于多个进程都需要异步通知的情况,各自注册为异步通知就可以了,当数据到达时,所有进程都将被通知到。"
"看一下ldd3第169页异步通知的说明:
“为了启用文件异步通知机制,用户程序必须执行两个步骤。首先,他们指定一个进程作为文件的“属主(owner)”。当进程使用fcntl系统调用执行 F_SETOWN命令时,属主进程的进程ID号就被保存在filp->f_owner中。这一步是必须的,目的是为了让内核知道应该通知哪个进程。……”"

我觉得filp->f_owner只有一个,所以多个进程在需要同一个异步通知的话是不可能的.
我做了一个test
void test_handler(int sigum)
{
        int value;
        printf("pid %d the test sigum = %d.\n",getpid(), sigum);
}

int main(void)
{
        int retval;
        int fd;
        int ts, maxfd;
        int ret = 0, i, j;
        unsigned char number;
        int oflags;
        int fd2;

        fd = open("/dev/key", O_RDWR); //|O_NONBLOCK);

        if (fd == -1) {
                printf("open device errr!\n");
                return 0;
        }
        signal(SIGIO, test_handler);
        fcntl(fd, F_SETOWN, getpid());
        oflags = fcntl(fd,F_GETFL);
        fcntl(fd, F_SETFL, oflags | FASYNC);
        while (1) {
                read(fd, &number, 1);
                printf("key=%d  0x%x\n",number, number);
                sleep(5);
        }
        close(fd);
        return 0;
}


步骤如下
1.    首先加载模块拉
2    ./test &
3   按键 这个test收到信号
pid 300 the test sigum = 29.
4   ./test & //增加一个进程
5   按键 这个test收到信号
pid 301 the test sigum = 29.
6   ./test & //增加一个进程
7   按键 这个test收到信号
pid 302 the test sigum = 29.

所以说filp->f_owner只有一个,而且是最近的一个.

[ 本帖最后由 dreamice 于 2008-11-5 12:25 编辑 ]

评分

参与人数 1可用积分 +15 收起 理由
dreamice + 15 我很赞同

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP