内核层与用户层信号异步通知问题

转载liaoxinmeng 发布于2010-03-05 15:45:00 阅读数 1200 收藏
展开
内核层与用户层信号异步通知一定要用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那些信号,如何从内核层通知到用户层呢?

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

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

我查了一下,至于多个进程都需要异步通知的情况,各自注册为异步通知就可以了,当数据到达时,所有进程都将被通知到。"
“看一下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只有一个,而且是最近的一个.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值