- 论坛徽章:
- 0
|
void input_handler()
{
char data[MAX_LEN];
int len;
//读取并输出STDIN_FILENO上的输入
len = read(fd, &data, MAX_LEN);
data[len] = 0;
printf("input available:%s\n", data);
}
main()
{
int oflags;
//启动信号驱动机制
fd=open("dev/chrdev",O_RDWR);
signal(SIGIO, input_handler);
fcntl(fd, F_SETOWN, getpid());
printf("a\n");
oflags = fcntl(STDIN_FILENO, F_GETFL);
printf("b\n");
fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);
printf("c\n");
}
驱动里的相关代码
static ssize_t chardev_read(struct file *filp, char __user *buff, size_t count, loff_t *f_pos)
{
int num=0;
if (down_interruptible(&sem))
goto err;
count = strlen(buffer);
num=copy_to_user(buff, buffer, count);
up(&sem);
return count;
err:
return -ERESTARTSYS;
}
static ssize_t chardev_write(struct file *filp, const char __user *buff, size_t count, loff_t *f_pos)
{
int num=0;
if (down_interruptible(&sem))
goto err;
memset(buffer, '\0', sizeof(buffer));
num=copy_from_user(buffer, buff, count);
up(&sem);
if (async)
kill_fasync(&async, SIGIO, POLL_IN);
printk("have started a signal\n");
return count;
err:
return -ERESTARTSYS;
}
static int chardev_fasync(int fd, struct file *filp, int mode)
{
return fasync_helper(fd, filp, mode, &async);
}
static int chardev_release(struct inode *inodp, struct file *filp)
{
return chardev_fasync(-1, filp, 0);
}
不明白上层执行后, input_handler()函数会连续执行很多次,以后在运行这个程序, input_handler()都不会被条用了,除非关闭SHELL终端,然后重新打开SHELL终端,就是说子SHELL终端打开后,只有第一次运行这个程序是 input_handler()会被调用而且是连续调用很多次,或者无数次,。
打印出来的c这条语句也会连续执行两次,这是怎么回事,而且static int chardev_release(struct inode *inodp, struct file *filp)
{
return chardev_fasync(-1, filp, 0);
}
return chardev_fasync(-1, filp, 0);这个是起什么作用,为什么会把这个函数放在chardev_release()函数里 |
|