2468|0

1560

帖子

24

TA的资源

五彩晶圆(初级)

楼主
 

2440学习(七)Linux文件操作 [复制链接]

本帖最后由 lonerzf 于 2014-7-27 11:36 编辑

前两天兼职去了,没有学什么。今天开始学习linux应用程序的编写。
本文参考文章:
http://blog.csdn.net/kickxxx/article/details/9468761
http://blog.csdn.net/mybelief321/article/details/8989755

1 虚拟文件系统(VFS)


除了linux标准的文件系统Ext2/Ext3/Ext4外,存在很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,网络文件系统nfs 以及flash 文件系统jffs2, yaffs/yaffs2 ubifs。linux通过叫做VFS的中间层最这些文件系统提供了完美的支持

对于用户来说,这些文件系统是几乎透明的,在大部分情况下,用户通过libc和kernel的VFS交互,不需要关心底层文件系统实现,但是有时应用程序也需要考虑底层文件系统限制(比如fat vfat不支持链接,比如各个文件系统支持最大文件限制不同)。


VFS在linux系统中的位置如下图所示:


VFS存在的意义
1. 向上对应用层提供一个标准的文件操作接口(open close write read 等);
2. 对下向文件系统提供一个灵活的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;
3. VFS内部则通过系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;
4. 此外VFS把一些复杂的操作分尽量抽象到VFS内部,使得底层文件系统实现更简单。


2 常见文件操作函数
2.1 open()函数

在open()函数中,flag参数可通过 “|” 组合构成,但前3个标志常量(O_RDONLY、O_WRONLY及O_RDWR)不能相互组合。perms是文件的存取权限,既可以用宏定义表示法,也可以用八进制表示法。
2.2 close()函数
2.3 read()函数

注意这里read函数返回值表明实际的读入字节数。关于返回值的类型,可以简单记住:ssize_t是有符号整形,size_t是无符号整形。


2.4 write()函数


2.5 lseek()函数


下面是lseek的几个常用使用方法:
      将读写位置移到文件开头:                                        lseek(int fd, 0, SEEK_SET);
      将读写位置移到文件尾:                                            lseek(int fd, 0, SEEK_END);
      取得目前文件位置:                                                   lseek(int fd, 0, SEEK_CUR);
      将源文件的读/写指针移到最后offset的起始位置:         lseek(fd, -offset, SEEK_END);


3 实验
实验代码如下:

#include
#include
#include
#include
#include
#include

char str[] = "If  a picture paints a thousand words, \
              then why can't I paint you? \
              The words will never show the you I've come to know. \
              if a face could launch a thousand ships,..";

void main(void)
{
        int fd = -1;
        int size = 0;
        char buffer_read[80] = {0};
        char buffer_write[20] = "Hello, this is zhao.";
        int len = 0;
        
        fd = open("./test.txt", O_RDWR | O_CREAT); //测试文件,这里可以自己设定。操作方式为读写,若文件不存在则创建。
        if(fd < 0)
        {
                perror("cannot open file.");
                exit(1);
        }
        len = read(fd, buffer_read, 67); //返回值len是实际读到的字节数。
        
        printf("%s\n", buffer_read);
        
        len = sizeof(buffer_write);
        printf("len = %d\n", len);
        
        lseek(fd, -5, SEEK_END); //读写指针跳转到离文件结尾5个字节的位置。
        write(fd, buffer_write, len);        
        close(fd);        
}


test.txt文件内容如下:

If a picture paints a thousand words,
then why can't I paint you?
The words would never show,
to you I've come to know . . .
If a face could launch a thousand ships,
then where am I to go?
There's no one home but you,
you're all thats left me to . . .
And when my love for life
is running dry,
You come and pour
yourself on me . . .
If a man could be two places at one time,
I'd be with you,
tomorrow and today,
beside you all the way . . .
If the world should stop revolving,
Spinning slowly down to die,
I'd spend the end with you
and when the world was through . . .
Then one by one
the stars would all go out . . .
Then you and I
would simply fly away!
-----0123456789-----
-HELLO,EEWORLD-
-----0123456789-----

结果如下:

4 小结
本帖初步复习文件操作相关函数的使用。



7.png (13.87 KB, 下载次数: 0)

7.png
此帖出自Linux开发论坛
点赞 关注
个人签名这孩子,成熟的象征,理智的典范。

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表