红联Linux门户
Linux帮助

新手请教读写问题

发布时间:2011-10-18 14:05:22来源:红联作者:shell507
资料上说函数read(fd,buff,n)是读取n个连续字符,而且是从第1个字符开始,那么怎么能直接从第m个字符开始读取n个字符呢?同理,write。
文章评论

共有 2 条评论

  1. shell507 于 2011-10-21 08:42:05发表:

    非常感谢!
    我编了个测试程序
    驱动模块:
    。。。。。。
    static loff_t TEST_llseek(struct file *s_file,loff_t offset,int fromwhere)
    {
    printk("entry llseek\n");
    return 0;
    }
    ssize_t TEST_write(struct file *s_file, const char *s_buffer, size_t s_size,
    loff_t *s_loff)
    {
    printk("entry write\n");
    return 0;
    }
    static struct file_operations TEST_fops=
    {
    ioctl : TEST_ioctl,
    llseek: TEST_llseek,
    write : TEST_write,
    read : TEST_read,
    };

    应用程序:
    void main()
    {
    。。。。
    if((fd=open("/dev/TEST",O_RDWR))==-1)
    {
    perror("open eror!!!\n");
    exit(1);
    }
    else
    printf("open ok!!!\n");
    while(1)
    {
    i=llseek(fd,0,0);
    printf("i is %d\n",i);
    write(fd,buffer,BYTEn);
    sleep(1);
    }
    }


    运行后,write能够正确输出(read,ioctl也没问题),可就是没有llseek后的打印信息,
    并且输出“i is -1”,这说明根本没正确进入,否则的话只能返回0。不知道为什么?

  2. lijiang 于 2011-10-20 18:17:28发表:

    楼主的问题涉及与函数read相关的函数lseek(),其原型为lseek(文件号fd,位移量,文件起始点);
    参数起始点用0,1,2分别代表“文件开始位置“、”文件当前位置“、”文件末尾“。
    所以只需将位置指针移到指定读写的位置,然后读写操作。具体为:
    lseek(fd,m,0);
    read(fd,buff,n);