liuguanhua
驱动牛犊
驱动牛犊
  • 注册日期2002-12-09
  • 最后登录2002-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1364回复:2

请教问题,驱动写文件方式使用函数不同用法.

楼主#
更多 发布于:2002-12-12 10:49
在驱动程序中使用 sys_write和使用task_struct->files->fd[fd]->f_op->write有什么不一样?
liuguanhua
驱动牛犊
驱动牛犊
  • 注册日期2002-12-09
  • 最后登录2002-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-13 09:44
for sys_write:
asmlinkage ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
{
ssize_t ret;
struct file * file;

ret = -EBADF;
file = fget(fd);
if (file) {
if (file->f_mode & FMODE_WRITE) {
struct inode *inode = file->f_dentry->d_inode;
ret = locks_verify_area(FLOCK_VERIFY_WRITE, inode, file, file->f_pos, count);
if (!ret) {
ssize_t (*write)(struct file *, const char *, size_t, loff_t *);
ret = -EINVAL;
if (file->f_op && (write = file->f_op->write) != NULL)
ret = write(file, buf, count, &file->f_pos);
}
}
if (ret > 0)
dnotify_parent(file->f_dentry, DN_MODIFY);
fput(file);
}
return ret;
}

At above, ret=write(), that write is your task_struct->files->fd[fd]->f_op->write.

Best regards.

________________________________________________________
这是源码sys_write函数定义
我看过,但我想问和任务队列中write有什么不一样
yftty
驱动牛犊
驱动牛犊
  • 注册日期2002-11-06
  • 最后登录2010-12-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-12 12:47
在驱动程序中使用 sys_write和使用task_struct->files->fd[fd]->f_op->write有什么不一样?


sys_write is the same as you use write in userspace.
fd=sys_open(filename, mode, flag);
len=sys_write(fd, buf, size);
sys_close(fd);
corresponding to:
fd=open();
len=write(fd,);
close(fd);

for sys_write:
asmlinkage ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
{
        ssize_t ret;
        struct file * file;

        ret = -EBADF;
        file = fget(fd);
        if (file) {
                if (file->f_mode & FMODE_WRITE) {
                        struct inode *inode = file->f_dentry->d_inode;
                        ret = locks_verify_area(FLOCK_VERIFY_WRITE, inode, file, file->f_pos, count);
                        if (!ret) {
                                ssize_t (*write)(struct file *, const char *, size_t, loff_t *);
                                ret = -EINVAL;
                                if (file->f_op && (write = file->f_op->write) != NULL)
                                        ret = write(file, buf, count, &file->f_pos);
                        }
                }
                if (ret > 0)
                        dnotify_parent(file->f_dentry, DN_MODIFY);
                fput(file);
        }
        return ret;
}

At above, ret=write(), that write is your task_struct->files->fd[fd]->f_op->write.

Best regards.
/yftty http://www.unix-driver.org
游客

返回顶部