Linux文件编程

本文详细介绍了文件权限的表示方法,包括可读、可写、可执行的符号和数字表示,并通过ls-l命令展示了文件属性。接着,解释了文件描述符的概念,它是内核对打开文件的引用,描述了其作用范围和常用操作如读写、关闭。通过代码示例展示了如何使用open、write、read、close等函数进行文件操作。最后,提到了文件光标偏移和lseek函数的重要性。
摘要由CSDN通过智能技术生成

文件权限

①可读 r
②可写 w
③可执行 x
也可用数字表示:r=4,w=2,x=1。所以7=rwx

ls -l    //查看当前目录文件属性

运行结果如下:

-rwxrw-r-- 1 xdq book 1 Sep  7 16:41 read.c

10个字符用于确定不同用户权限。共分为四个部分:类型、文件所有者、文件所有者同组用户、其他用户。

  • 第一个字符代表文件(-)、目录(d),链接(l)
  • 第一组rwx:文件所有者的权限是可读可写可执行
  • 第二组rw-:文件所有者同组用户的权限是可读可写
  • 第三组r–:其他用户的权限为仅可读

文件描述符

1.对内核来说,所有打开文件都是用文件描述符引用。fd是一个非负整数,当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传递给read和write。Linux系统包括的默认文件描述符:

0标准输入   
1标准输出    
2标准错误
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
        char readBuf[128];

        read(0,readBuf,5);
        write(1,readBuf,strlen(readBuf));
        printf("\n");

        return 0;
}

2.文件描述符这个数字在一个进程中表示一个特定的含义。当open一个文件时,操作系统在内存中构建了数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和内存中的动态文件的数据绑定。后续操作动态文件,只需要用这个文件描述符区分。

3.文件描述符的作用域是当前进程。open函数打开文件成功返回一个文件描述符,失败返回-1。

linux文件操作基本流程

①打开/创建文件
②读/写文件
③关闭文件

文件操作解析

1.先使用open函数打开文件,打开成功得到文件描述符,然后对文件进行读写(或其他)操作,最后使用close函数关闭文件,若不关闭文件会造成文件损坏。

2.文件存放在块设备文件系统中,称为静态文件。打开文件时,内核在进程中创建数据结构(结构体)记录打开的文件;同时申请一段内存将静态文件的内容从块设备中提取到内核中的特定地址存放管理(动态文件)。

3.打开文件后对文件的操作都是针对动态文件进行操作。对动态文件操作完成后,动态文件与静态文件的内容并不匹配,关闭文件时内核将动态文件的内容更新到静态文件中。

4.为何这样操作?
块设备对块进行操作,内存对字节进行操作。进行修改时,只能对整个块进行操作,无法对单个字节进行操作。

打开/创建文件(open)

函数原型:

参数说明:
pathname:打开/创建的文件名字(含路径)
flags:打开文件的操作方式

主类:
O_RDONLY    只读
O_WRONLY    只写
O_RDWR      可读可写        //三者只可选其一

副类:
O_CREAT     如果文件不存在则创建该文件
O_EXCL      如果使用O_CREAT选项且文件存在,则返回错误消息(-1)  
O_TRUNC     如果文件已经存在则删除文件中原有数据
O_APPEND    以追加的方式打开,加到文件的尾端
O_NOCTTY    如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端

mode:创建文件时的文件权限
返回值:
成功返回文件描述符,失败返回-1
实例:

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

int main()
{
        int fd;
        fd = open("./file1",O_RDWR|O_CREAT,0600);
 		printf("fd = %d\n",fd);
        if(fd == -1){
                printf("error!\n");
                exit(-1);
        }

        return 0;
}

运行结果:

fd = 3
-rw------- 1 xdq book    0 Sep  7 17:21 file1     //通过ls -l查看

关闭文件(close)

对文件进行操作(读写)时,操作完成都需要关闭文件,否则会造成文件损坏。
函数原型:
在这里插入图片描述
参数说明:
fd:文件描述符

写文件(write)

函数原型:
在这里插入图片描述
参数说明:
fd:文件描述符
buf:存放写入内容的缓冲区
count:写入的字节数
返回值:
没有写入内容返回-1 ,成功写入返回字节数

  • 注意:如果文件中有内容,且打开文件时没有进行处理,则会覆盖原来的内容

读文件(read)

函数原型:
在这里插入图片描述
参数说明:
fd:文件描述符
buf:存放读取内容的缓冲区
count:读取的字节数
返回值:
成功读取返回读取的字节数,若光标在文件结尾返回0,失败则返回-1

文件光标偏移(lseek)

对文件进行读写操作时,光标会不断偏移。当写入内容后,光标偏移至文件尾,此时读取不到内容,需要将光标移动到文件头才能正常读取。
函数原型:
在这里插入图片描述
参数说明:
fd:文件描述符
offset:偏移值(偏移的字节数,offset可以是负值。正值向后偏移,负值向前偏移)
whence:偏移基础位置(在这个基础上偏移offset个字节)

whence为以下其中一种:
SEEK_SET 文件头
SEEK_CUR 文件当前位置
SEEK_END 文件尾

返回值:
成功返回偏移值,失败返回-1

综合实例

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

int main()
{
        int fd;
        ssize_t n_write;
        ssize_t n_read;
        char *writeBuf = "hello world!";
        char *readBuf;

        //打开/创建文件
        fd = open("./file1",O_RDWR|O_CREAT,0600);
        printf("fd = %d\n",fd);
        if(fd == -1){
                printf("error!\n");
                exit(-1);
        }

        //写文件
        n_write = write(fd,writeBuf,strlen(writeBuf));
        printf("n_write = %d\n",(int)n_write);

        //光标偏移
        lseek(fd,0,SEEK_SET);

        //读文件
        readBuf = (char *)malloc(n_write);
        n_read = read(fd,readBuf,n_write);
        printf("n_read = %d   txt:%s\n",(int)n_read,readBuf);

        //关闭文件
        close(fd);
        
        return 0;
}

运行结果:

fd = 3
n_write = 12
n_read = 12   txt:hello world!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值