Linux文件

目录

一、基本概念

二、研究进程和被打开文件的关系

(一)w方式

(二)a方式

三、认识系统接口,操作文件

(一)认识文件描述符

(二)举例

(三)理解文件


一、基本概念

1、所有对文件的操作

  • a、对内容操作
  • b、对属性操作

2、内容是数据,属性也是数据------存储文件,必须既存储内容,又存放数据

  • 此处的文件,默认就是在磁盘上的文件,加载磁盘上的文件,一定会涉及访问磁盘设备(由操作系统来做)

3、我们要访问一个文件的时候,都是要把这个文件先打开

  • 访问的本质:进程要访问一个文件
  • 打开后本质是:将文件加载到内存

4、一个进程可以打开多个文件吗?多个进程可以打开多个文件吗?

  • 加载到内存,被打开的文件,可能会存在多个
  • 进程:打开的文件 = 1 :n(1)

5、根据1和4,操作系统在运行中,可能打开很多个文件,操作系统要不要管理打开的文件呢???需要,如何管理???先描述后组织

6、文件按照是否被打开,分成:被打开的文件(在内存),没有被打开的文件(在磁盘中)

二、研究进程和被打开文件的关系

(一)w方式

  • w:以写的方式打开,如果文件不存在就创建它
cpp 复制代码
#include<stdio.h>    
int main()    
{    
    FILE *fp=fopen("log.txt","w");    
    if(NULL == fp)    
    {    
        perror("fopen");    
        return 1;    
    }    
    
    const char*msg = "hello world\n";    
    int cnt = 10;    
    while(cnt)    
    {    
        fputs(msg, fp);    
        cnt--;    
    }    
    
    fclose(fp);    
    return 0;                                                                                                                                    
}

(二)a方式

  • a:也是写入,从文件结尾处开始写入,不会清空文件,是追加
cpp 复制代码
#include<stdio.h>    
int main()    
{    
    FILE *fp=fopen("log.txt","a");    
    if(NULL == fp)    
    {    
        perror("fopen");    
        return 1;    
    }    
    
    const char *msg = "message.txt\n";    
    fputs(msg,fp);                                                                                                                               
    return 0;    
} 

三、认识系统接口,操作文件

cpp 复制代码
man 2 open
cpp 复制代码
NAME
       open, creat - open and possibly create a file or device

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

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

       int creat(const char *pathname, mode_t mode);
  • pathname 这是一个字符串,指定要打开或创建的文件的路径名。它可以是文件的相对路径或绝对路径。

  • flags 这是一个整数参数,表示打开文件的方式和行为。它可以是以下几个常见标志的组合:

    • O_RDONLY:只读方式打开文件。
    • O_WRONLY:只写方式打开文件。
    • O_RDWR:读写方式打开文件。
    • O_CREAT:如果文件不存在,则创建文件。
    • O_APPEND:在文件末尾追加内容而不覆盖原有内容。
    • O_TRUNC:如果文件存在,并且以写入方式打开,那么清空文件内容。
    • O_EXCL:与O_CREAT一同使用时,如果文件存在则返回错误。
  • mode 这是一个权限参数,仅在使用O_CREAT标志时才需要提供。它定义了新创建文件的权限。通常使用八进制表示,比如 0644 表示文件所有者具有读写权限,其他用户只有读权限。

  • 返回值:返回一个文件描述符(fd),如果出现错误则返回-1

(一)认识文件描述符

cpp 复制代码
#include<stdio.h>    
    
#define print1  1         //0001    
#define print2 (1<<1)     //0010    
#define print3 (1<<2)     //0100    
#define print4 (1<<3)     //1000    
    
void print(int flags)    
{    
    if(flags & print1) printf("hello 1\n"); //检查 flags 中是否包含 print1 对应的标志位
    if(flags & print2) printf("hello 2\n");    
    if(flags & print3) printf("hello 3\n");    
    if(flags & print4) printf("hello 4\n");    
    else printf("None\n");    
}    
int main()    
{    
    print(print1); //输出了 hello 1,因为 print1 代表的标志位被设置 
    printf("------------\n");    
    print(print1|print2);//输出了 hello 1 和 hello 2,因为 print1 和 print2 的标志位都被设置 
    printf("------------\n");    
    print(print1|print2 | print3); 
    printf("------------\n");    
    print(print3|print4);    
    printf("------------\n");                                                                                                                    
    print(print4);    
    
    return 0;    
}

(二)举例

cpp 复制代码
#include <stdio.h>    
#include <unistd.h>//close的头文件    
#include <string.h>//strlen的头文件    
//下面三个是open的头文件    
#include <sys/types.h>    
#include <sys/stat.h>    
#include <fcntl.h>    
    
int main()    
{    
    umask(0);//更改掩码    
    int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666);    
    if(fd < 0)    
    {    
        perror("open");    
        return 1;    
    }    
    
    const char *msg="aaaaa";    
    write(fd,msg,strlen(msg));    
    close(fd);    
    return 0;    
} 

(三)理解文件

相关推荐
松涛和鸣2 分钟前
35、Linux IPC进阶:信号与System V共享内存
linux·运维·服务器·数据库·算法·list
惊鸿一博4 分钟前
Linux文件同步/镜像—rsync
linux·运维
守城小轩5 分钟前
基于Chrome140的Quora账号自动化(关键词浏览)——脚本撰写(二)
运维·自动化·chrome devtools·浏览器自动化·浏览器开发
SunnyDays10116 分钟前
Python 实现 PDF 文档压缩:完整指南
linux·开发语言·python
金海境科技8 分钟前
【服务器数据恢复】H3C华三Ceph分布式存储文件丢失数据恢复案例
服务器·经验分享·分布式·ceph
weixin_3077791311 分钟前
Jenkins Pipeline: Input Step插件详解与实践指南
运维·开发语言·自动化·jenkins·etl
宵时待雨14 分钟前
C语言笔记归纳21:编译与链接
linux·c语言·开发语言·笔记
Q741_14717 分钟前
Linux 进程核心解析 fork()详解 多进程的创建与回收 C++
linux·c++·面试·笔试·进程
南知意-17 分钟前
从零搭建 Live2D 看板娘教程(自建API避墙版)
服务器·前端·vue.js·开源·博客·美化·看板娘
CIb0la17 分钟前
如何维持精力旺盛
运维·生活