【Linux后端服务器开发】基础IO与文件系统

这篇具有很好参考价值的文章主要介绍了【Linux后端服务器开发】基础IO与文件系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基础IO

1. C语言文件读写

2. 标志位传参

3. C语言与系统调用关系

二、文件系统

1. 文件描述符

2. 输入输出重定向


一、基础IO

文件调用

  • 库函数接口: fopen、fclose、fwrite、fread、fseek
  • 系统调用接口:open、close、write、read、lseek

1. C语言文件读写

  • r/w/a :读/写/追加
  • 若打开的文件不存在,“r”报错,“w/a”创建
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main() 
{
    //FILE* pf = fopen("test.txt", "w");
    //FILE* pf = fopen("test.txt", "a");
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL) 
    {
        perror("fopen");
        exit(errno);
    }

    //w
    // int cnt = 5;
    // while (cnt--) 
    //     fprintf(pf, "%s\n", "hello world -- write");


    //a
    // int cnt = 5;
    // while (cnt--) 
    //     fprintf(pf, "%s\n", "append");


    //r
    char buffer[64];
    while (fgets(buffer, sizeof(buffer) - 1, pf)) 
    {
        buffer[strlen(buffer) - 1] = 0;
        printf("%s\n", buffer);
    }

    return 0;       
}

2. 标志位传参

#include <stdio.h>

#define ONE (1 << 1)
#define TWO (1 << 2)
#define THREE (1 << 3)
#define FOUR (1 << 4)

void Show(int flag) 
{
    if (flag & ONE) 
        printf("one\n");
    if (flag & TWO) 
        printf("two\n");
    if (flag & THREE) 
        printf("three\n");
    if (flag & FOUR) 
        printf("four\n");
}

void ShowTest() 
{
    Show(ONE);
    printf("-----------\n");
    Show(TWO);
    printf("-----------\n");
    Show(TWO | THREE);
    printf("-----------\n");
    Show(TWO | THREE | FOUR);
}

int main() 
{
    ShowTest();
    return 0;       
}

【Linux后端服务器开发】基础IO与文件系统,Linux后端服务器开发,服务器,linux,运维

 

3. C语言与系统调用关系

  • "w" ----> O_WRONLY | O_CREAT | O_TRUNC
  • "a" ----> O_WRONLY | O_CREAT | O_APPEND
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main() 
{
    umask(0);   //只修改当前进程的umask
    //int fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    //int fd = open("test.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd = open("test.txt", O_RDONLY);
    if (fd < 0) 
    {
        perror("open");
        return 1;
    }

    //写/追加
    // int cnt = 5;
    // char outBuffer[64] = {0};
    // while (cnt--) 
    // {
    //     sprintf(outBuffer, "%s: %d\n", "hello --- a", cnt);
    //     write(fd, outBuffer, strlen(outBuffer));
    // }

    //读
    char buffer[1024];
    ssize_t num = read(fd, buffer, sizeof(buffer) -  1);
    if (num > 0) 
    {
        buffer[num] = 0;
    }
    printf("%s", buffer);

    return 0;       
}

二、文件系统

在Linux中,一切皆文件,不仅普通的文件和目录,块设备、管道、socket等等,都是由文件系统管理的。在Linux中的文件系统会给每个文件分配两个数据结构:索引节点(index node)和目录项(directory entry),它们都主要是被用来记录文件的元信息和目录层次结构。

  • 索引节点,inode,用来记录文件的元信息,比如inode编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等。索引节点是文件的唯一标识,它们之间一一对应,也同样都是被存储在硬盘当中,索引节点也是会占用磁盘的存储空间的。
  • 目录项,dentry,用来记录文件的名字,索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但是它与索引节点不相同的是,目录项是由内核维护的一个数据结构,不是存放咋磁盘中,而是缓存在内存里面。目录项包括文件名和inode节点号。

1. 文件描述符

文件描述符(file descripter)FD:Linux内容默认情况下一个进程只能打开1024个文件,内核为了管理进程,当一个进程打开了哪些文件,内核就会维护一个表,这个表就会记录这个进程打开了哪些文件,然后给每个文件进行编号,这个编号就叫文件描述符(句柄),默认文件描述符的范围为0-1023。
 

三个标准输入输出流:

  • stdin:标准输入,0
  • stdout:标准输出,1
  • stderr:标准错误,2

FILE ----> 结构体

文件描述符表:struct file* fd_array[]

文件分配规则:寻找最小且没被占用的下标

【Linux后端服务器开发】基础IO与文件系统,Linux后端服务器开发,服务器,linux,运维

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

#define TEST_FILE(number) "test"#number

int main() 
{
    umask(0);
    printf("stdin   --->   fd : %d\n", stdin->_fileno);     //0
    printf("stdout  --->   fd : %d\n", stdout->_fileno);    //1
    printf("stderr  --->   fd : %d\n", stderr->_fileno);    //2

    //close(0);
    //close(2);
    close(1);   //关闭文件描述符对应下标的文件
                //关闭文件描述符表的 1 后, fd0 会被分配到 1 的位置,也就是原本stdout的位置
                //而原本输出到stdout的数据,会写入 fd0 中

    int fd0 = open(TEST_FILE(0), O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd1 = open(TEST_FILE(1), O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd2 = open(TEST_FILE(2), O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd3 = open(TEST_FILE(3), O_WRONLY | O_CREAT | O_APPEND, 0666);

    printf("fd : %d\n", fd0);
    printf("fd : %d\n", fd1);
    printf("fd : %d\n", fd2);
    printf("fd : %d\n", fd3);       //fd分配规则,寻找最小的且没被占用的下标
    fprintf(stdout, "fd : %d\n", fd3);  //打印到 f0 对应的文件
    fflush(stdout);

    close(fd0);
    close(fd1);
    close(fd2);
    close(fd3);

    return 0;       
}

【Linux后端服务器开发】基础IO与文件系统,Linux后端服务器开发,服务器,linux,运维

2. 输入输出重定向

int dup2(int old_fd, int new_fd)

重定向:将新的文件文件描述符充当老的文件描述符的一份拷贝(old_fd内容 拷贝到 new_fd内容)

上层的fd不变,在内核中更改fd对应的struct file*地址文章来源地址https://www.toymoban.com/news/detail-557432.html

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main() 
{
    umask(0);
    //int fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    //int fd = open("test.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd = open("test.txt", O_RDONLY);
    if (fd < 0) 
    {
        perror("open");
        return 1;
    }

    //输出重定向
    // dup2(fd, 1);
    // printf("open fd: %d\n", fd);
    // fprintf(stdout, "open fd: %d\n", fd);
    // const char* msg = "hello world\n";
    // write(1, msg, strlen(msg));
    // fflush(stdout);

    //输入重定向
    dup2(fd, 0);
    char line[1024];
    while (1) 
    {
        printf("> ");
        if (fgets(line, sizeof(line) - 1, stdin) == NULL) 
            break;
        printf("%s", line);
    }

    close(fd);
    return 0;       
}

到了这里,关于【Linux后端服务器开发】基础IO与文件系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于linux下的高并发服务器开发(第一章)- Linux系统IO函数

     (1)man 2 open 打开一个已经存在的文件 int open(const char *pathname, int flags); 参数:             pathname:要打开文件路径             - flags:对文件的操作权限设置还有其他的设置             O_RDONLY,O_WRONLY,O_RDWR 这三个设置是互斥的 返回值:             返回一个新的文件描述

    2024年02月16日
    浏览(60)
  • 【Linux后端服务器开发】封装线程池实现TCP多线程通信

    目录 一、线程池模块 Thread.h LockGuard.h ThreadPool.h 二、任务模块模块 Task.h 三、日志模块 Log.h 四、守护进程模块 Deamon.h  五、TCP通信模块 Server.h Client.h server.cpp client.cpp 关于TCP通信协议的封装,此篇博客有详述: 【Linux后端服务器开发】TCP通信设计_命运on-9的博客-CSDN博客 线程池

    2024年02月16日
    浏览(45)
  • 【Linux后端服务器开发】协议定制(序列化与反序列化)

    目录 一、应用层协议概述 二、序列化与反序列化 Protocal.h头文件 Server.h头文件 Client.h头文件 server.cpp源文件 client.cpp源文件 什么是应用层 ?我们通过编写程序解决一个个实际问题、满足我们日常需求的网络程序,都是应用层程序。 协议是一种“约定”,socket的api接口,在读

    2024年02月16日
    浏览(41)
  • Flask框架小程序后端分离开发学习笔记《2》构建基础的HTTP服务器

    Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。本节提供一个构建简单的本地服务器的代码,仔细看注释,学习每一步的流程,理解服务器接收请求,回复响应的基本原理。 代码效果,运行之后,在浏览器输入:localhost:2000 总结 1.导入socket库:这个库

    2024年01月18日
    浏览(44)
  • 强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

    目录 第1章 TCP/IP协议 1.1 TCP/IP协议族体系结构以及主要协议 1.1.1 数据链路层 1.1.2 网络层 1.1.3 传输层 1.1.4 应用层 1.2 封装 1.3 分用 1.5 ARP协议工作原理 1.5.1 以太网ARP请求/应答报文详解 1.5.2 ARP高速缓存的查看和修改 1.5.3 使用tcpdump观察ARP通信过程所得结果如下 本篇核心关键所在

    2024年02月07日
    浏览(50)
  • linux并发服务器 —— IO多路复用(八)

    半关闭只能实现数据单方向的传输;当TCP 接中A向 B 发送 FIN 请求关闭,另一端 B 回应ACK 之后 (A 端进入 FIN_WAIT_2 状态),并没有立即发送 FIN 给 A,A 方处于半连接状态 (半开关),此时 A 可以接收 B 发送的数据,但是 A 已经不能再向 B 发送数据 close不会影响到其他进程,shutdown会

    2024年02月09日
    浏览(51)
  • 多路IO—POll函数,epoll服务器开发流程

    \\\"在计算机网络编程中,多路IO技术是非常常见的一种技术。其中,Poll函数和Epoll函数是最为常用的两种多路IO技术。这两种技术可以帮助服务器端处理多个客户端的并发请求,提高了服务器的性能。本文将介绍Poll和Epoll函数的使用方法,并探讨了在服务器开发中使用这两种技

    2024年02月06日
    浏览(42)
  • Linux多路IO复用技术——epoll详解与一对多服务器实现

    本文详细介绍了Linux中epoll模型的优化原理和使用方法,以及如何利用epoll模型实现简易的一对多服务器。通过对epoll模型的优化和相关接口的解释,帮助读者理解epoll模型的工作原理和优缺点,同时附带代码实现和图解说明。

    2024年02月05日
    浏览(43)
  • Linux学习记录——사십일 高级IO(2)--- Select型服务器

    select就是多路转接IO。select能以某种形式,等待多个文件描述符,只要有哪个fd有数据就可以读取并全部返回。就绪的fd,要让用户知道。select等待的多个fd中,一定有少量或者全部都准备好了数据。 nfds输入型参数,表示select等待的多个fd中,fd对应的数 + 1 剩下四个参数都是输

    2024年01月16日
    浏览(52)
  • Linux学习记录——사십삼 高级IO(4)--- Epoll型服务器(1)

    poll依然需要OS去遍历所有fd。一个进程去多个特定的文件中等待,只要有一个就绪,就使用select/poll系统调用,让操作系统把所有文件遍历一遍,哪些就绪就加上哪些fd,再返回。一旦文件太多了,遍历效率就显而易见地低。epoll是为处理大批量句柄而作了改进的poll,句柄就是

    2024年01月18日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包