linux文件系统编程

1.linux系统文件编程

在linux里面,系统会提供一些API 专属只在linux里面运行

比如  打开/创建   open/creat

         读写    write/read

         光标定位 lseek

         关闭     close

1.打开/创建

在linux通过man手册可以查询相关的头文件及函数定义

open两种用法 成功的返回值是一个文件描述符 小的非负整数 失败时返回-1

int open(const char *pathname, int flags);

int open(const char *pathname, int flags,int mode);
    pathname要打开的文件路径和名称                           

    flags访问模式,宏定义和含义如下:                        
        O_RDONLY          1    只读打开                         
        O_WRONLY         2    只写打开                         
        O_RDWR             4    读写打开                     
        还可选择以下模式与以上3种基本模式相与 (|):                    
            O_CREAT      0x0100   创建一个文件并打开                
            O_TRUNC     0x0200   打开一个已存在的文件并将文件长度设置为0 清空,其他属性保持                      

            O_APPEND   0x0800   追加打开文件  在已有的内容后面添加                   
            O_TEXT         0x4000   打开文本文件翻译CR-LF控制字符     
            O_BINARY     0x8000   打开二进制字符,不作CR-LF译           

                                             
    mode 该参数仅在flags=O_CREAT方式下使用,访问权限其取值如下:      
        S_IFMT       0xF000   文件类型掩码                      
        S_IFDIR      0x4000   目录                              
        S_IFIFO      0x1000   FIFO 专用                         
        S_IFCHR    0x2000   字符专用                          
        S_IFBLK     0x3000   块专用                            
        S_IFREG    0x8000   只为0x0000                        
        S_IREAD    0x0100   可读                              
        S_IWRITE   0x0080   可写                              
        S_IEXEC     0x0040   可执行

例如

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
        int fd;
        fd=open("./file1",O_RDWR);
        printf("%d\n",fd);

        return 0;
}
                                               

当前路径下没有文件file1 所以打开失败

此时除了在当前路径手动创建一个file1(touch file1)文件外 还可以用指令创建文件

改写open("./file1",O_RDWR| O_CREAT,0600);    此时在执行就会创建文件 并增加权限

    

0600就是文件file1的权限可读可写不可执行

当热也可以直接用creat创建文件

2.读写操作

#include <unistd.h>  头问件

 ssize_t read(int fd, void *buf, size_t count);
 ssize_t write(int fd, const void *buf, size_t count);

fd:文件描述符   buf:缓冲区 count:大小

buf是个指针类型的数据都行 不一定是字符串也可以是整数 

write:将缓冲区buf内存里的数据写count个字节大小写到fd对应的文件里面

read:从fd指向的文件读取count个字节放到buf里面

写操作

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main()
{
        int fd;
        char *buf="hello world";

        fd=open("./file1",O_RDWR);

        write(fd,buf,strlen(buf));


        printf("%s\n",buf);

        close(fd);

        return 0;
}

读写操作

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
        int fd;
        char *buf="hello world";

        fd=open("./file1",O_RDWR);
        int n_write=write(fd,buf,strlen(buf));
        close(fd);

        fd=open("./file1",O_RDWR);
        char *readbuf;

        readbuf=(char *)malloc(sizeof(char)*n_write+1);
        int n_read =read(fd,readbuf,n_write);

        printf("%d\n",n_write);
        printf("%d\n",n_read);
        printf("%s\n",buf);
        printf("%s\n",readbuf);
        close(fd);

        return 0;
}

 因为光标的问题写完关闭 重新打开读取

3.光标移动

写完之后 光标会定位到最后一个字 这是如果读的话 是从光标的位置开始读的 所以光标需要重新移动到头位置

offset:偏移值

whence的参数选择

    SEEK_SET:指向头

    SEEK_END:指向尾

    SEEK_CUR:当前位置

上述代码改进

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
        int fd;
        char *buf="hello world";
        fd=open("./file1",O_RDWR);
        int n_write=write(fd,buf,strlen(buf));
        lseek(fd,0,SEEK_SET);
        char *readbuf;
        readbuf=(char *)malloc(sizeof(char)*n_write+1);
        int n_read =read(fd,readbuf,n_write);
        printf("%d\n",n_write);
        printf("%d\n",n_read);
        printf("%s\n",buf);
        printf("%s\n",readbuf);
        close(fd);
        return 0;
}

运行结果与上述一样

11个字节 也可以让光标偏移 使用lseek(fd,-11,SEEK_CUR); 运行结果一样

也可以使用光标求文件大小

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
        int fd;
        char *buf="hello world";
    
        fd=open("./file1",O_RDWR);
        int seek=lseek(fd,0,SEEK_END);
    
        printf("%d\n",seek);
        close(fd);

        return 0;
}

4.文件编程补充

linux系统有默认的标准输入输出文件描述符

0:标准输入

1:标准输出

2:标准错误

#include<stdio.h>     
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>    
int main()
{

   int fd;     //文件描述符
   char *readbuf;     //缓存区
   readbuf=(char *)malloc(128);
   memset(readbuf,'\0',128);
   int n_read  = read(0,readbuf,100);             //读入100个字节存入缓存区readbuf 
                                     //不能用strlen因为刚开始空间为0  文件描述符为0 是标准输入也是键盘输入
   int n_write = write(1,readbuf,strlen(readbuf)); //将缓存区的数据 以标准输出1的形式输出 
   printf("n_read =%d\n",n_read); 
   printf("n_write=%d\n",n_write); //字符数量
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模拟Linux文件系统。在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的 模拟Linux文件系统 在现有机器硬盘上开辟20M的硬盘空间,作为设定的硬盘空间。 2. 编写一管理程序对此空间进行管理,以模拟Linux文件系统,具体要求如下: (1) 要求盘块大小1k 正规文件 (2) i 结点文件类型 目录文件 (共1byte) 块设备 管道文件 物理地址(索引表) 共有13个表项,每表项2byte 文件长度 4byte 。联结计数 1byte (3)0号块 超级块 栈长度50 空闲盘块的管理:成组链接 ( UNIX) 位示图法 (Linux) (4)每建一个目录,分配4个物理块 文件名 14byte (5)目录项信息 i 结点号 2byte (6)结构: 0#: 超级块 1#-20#号为 i 结点区 20#-30#号为根目录区 3. 该管理程序的功能要求如下: (1) 能够显示整个系统信息,源文件可以进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 (2) 改变目录:改变当前工作目录,目录不存在时给出出错信息。 (3) 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 (4) 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 (5) 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 (6) 建立文件(需给出文件名,文件长度)。 (7) 打开文件(显示文件所占的盘块)。 (8) 删除文件:删除指定文件,不存在时给出出错信息。 4. 程序的总体流程为: (1) 初始化文件目录; (2) 输出提示符,等待接受命令,分析键入的命令; (3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值