- 论坛徽章:
- 0
|
原帖由 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 编辑 ] |
评分
-
查看全部评分
|