Linux 基础IO(个人笔记)

news2024/11/17 6:00:23

Linux基础 IO

  • 1.C文件IO操作
    • 1.1 hello.c写文件
    • 1.2 hello.c读文件
    • 1.3 stdin&stdout&stderr
  • 2.系统文件I/O
    • 2.1 hello.c写文件
    • 2.2 hello.c读文件
    • 2.3 open函数介绍
    • 2.4 文件描述符 fd
      • 2.4.1 文件描述符的分配规则
      • 2.4.2 重定向
      • 2.4.3 dup2系统调用
      • 2.4.4 C文件结构体FILE
      • 2.4.5 C文件缓冲区
  • 3. 文件系统
    • 3.1文件的软硬链接
      • 3.1.1 软链接
      • 3.1.2 硬链接
  • 4. 动静态库


1.C文件IO操作

1.1 hello.c写文件

#include<stdio.h>
#include<string.h>

int main()
{
	FILE* fp = fopen("myfile", "w");
	if (fp == NULL)
	{
		printf("fopen error\n");
	}

	const char* msg = "hello LJH\n";
	int count = 5;
	while (count--)
	{
		fwrite(msg, strlen(msg), 1, fp);
	}
	fclose(fp);

	return 0;
}

1.2 hello.c读文件

#include<stdio.h>
#include<string.h>

int main()
{
	FILE* fp = fopen("myfile", "r");
	if (!fp)
	{
		printf("fopen error!\n");
	}

	char buf[1024];
	const char* msg = "hello LJH!\n";
	while (1)
	{
		size_t s = fread(buf, 1, strlen(msg), fp);
		if (s > 0)
		{
			buf[s] = 0;
			printf("%s", buf);
		}
		if (feof(fp))
		{
			break;
		}
	}
	fclose(fp);

	return 0;
}

1.3 stdin&stdout&stderr

C默认会打开三个输入输出流:stdin,stdout,stderr
且三个流的类型都是FILE*

2.系统文件I/O

系统接口来访问文件

2.1 hello.c写文件

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

int main()
{
  umask(0);
  int fd = open("myfile", O_WRONLY | O_CREAT, 0644);
  if (fd < 0)
  {
    perror("open");
    return 1;
  }

  int count = 5;
  const char *msg = "hello LJH!\n";
  int len = strlen(msg);
  while (count--)
  {
    write(fd, msg, len);
  }

  close(fd);
  return 0;
}

2.2 hello.c读文件

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

int main()
{
  int fd = open("myfile", O_RDONLY);
  if (fd < 0)
  {
    perror("open");
    return 1;
  }

  const char *msg = "hello LJH\n";
  char buf[1024];
  while (1)
  {
    ssize_t s = read(fd, buf, strlen(msg));
    if (s > 0)
    {
      printf("%s", buf);
    }
    else
    {
      break;
    }
  }
  close(fd);

  return 0;
}

2.3 open函数介绍

//所需要的头文件
#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);

//pathname: 要打开或创建的目标文件
//flags标记位: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
//flags标记位参数:
//O_RDONLY: 只读打开
//O_WRONLY: 只写打开
//O_RDWR : 读,写打开
//这三个常量,必须指定一个且只能指定一个
//O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
//O_APPEND: 追加写
//返回值:
 //成功:新打开的文件描述符
 //失败:-1

2.4 文件描述符 fd

fd其实是文件描述符表的数组下标
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2.
在这里插入图片描述

2.4.1 文件描述符的分配规则

在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。

2.4.2 重定向

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
   close(1);
   int fd = open("myfile", O_WRONLY|O_CREAT, 00644);
   if(fd < 0){
   perror("open");
   return 1;
 }
   printf("fd: %d\n", fd);
   fflush(stdout);
 
   close(fd);
   exit(0);
}

本应该通过文件描述符输出到显示器上的内容,输出到文件myfile当中,fd=1,这就是文件重定向.
在这里插入图片描述

2.4.3 dup2系统调用

#include <unistd.h>
int dup2(int oldfd, int newfd);

测试代码

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

int main()
{
  int fd = open("myfile", O_RDONLY);
  if (fd < 0)
  {
    perror("open");
    return 1;
  }
  dup2(fd, 0);
  close(fd);
  char buf[1024];
  while (1)
  {
    if(fgets(buf,sizeof(buf),stdin)==NULL)
    {
      break;
    }
    printf("Read:%s",buf);
    sleep(1);
  }
  return 0;
}

2.4.4 C文件结构体FILE

IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问
所以C库当中的FILE结构体内部,必定封装了fd。
在这里插入图片描述
在这里插入图片描述

2.4.5 C文件缓冲区

这里解释下语言层面的缓冲区
先看代码

#include <stdio.h>
#include <string.h>
int main()
{
   const char *msg0="hello printf\n";
   const char *msg1="hello fwrite\n";
   const char *msg2="hello write\n";
   printf("%s", msg0);
   fwrite(msg1, strlen(msg0), 1, stdout);
   write(1, msg2, strlen(msg2));
   fork();
   return 0;
}

这里进行./hello>file后,打印结果如下

hello write
hello printf
hello fwrite
hello printf
hello fwrite

原因是:
1.C库函数写入文件时是全缓冲,而写入显示器是行缓冲
2.当文件重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲
3.然而放在缓冲区的数据就不会被立即刷新,fork之后也是如此
4.但进程退出后,会统一刷新,写入文件中
5.但是fork之后,父子数据发生写时拷贝,父进程准备刷新的时候,子进程也就有了同样的一份数据,也就是两份数据
6.write系统调用,就没有所谓的缓冲区
在这里插入图片描述

3. 文件系统

权限 硬链接数 文件所有者 文件所属组 文件大小 文件最后修改时间 文件名
在这里插入图片描述
除了ls -l 查看之外,stat+文件名,能查看更多信息
在这里插入图片描述
从硬件开始了解文件系统
在这里插入图片描述
磁盘存储的逻辑抽象结构
将磁盘盘片想象成为线性空间

在这里插入图片描述
以上是按照扇区进行存取,也可以基于文件系统,按照文件块为单位进行数据存取,也就是LBA
在这里插入图片描述
一个磁盘都会进行分区管理,一般的磁盘500g内存,进行分区管理
然而管理磁盘内存是可以进行迁移的,要管好100g,也就只需要管好2g
在这里插入图片描述
保存文件属性是通过inode保存
inode节点表:存放文件属性:文件大小,所有者,最近修改时间等
在这里插入图片描述
数据区:存放文件内容
在这里插入图片描述
inode位图:每个bit表示一个inode是否空闲可用
块位图:记录data block中那个数据块已经被占用,那个数据块没有被占用
超级块:存放文件系统本身的结构信息,如果被破坏,整个文件系统瘫痪
在这里插入图片描述

3.1文件的软硬链接

操作系统在磁盘中找文件不是通过文件名,而是通过inode,Linux中可以让多个文件名对应同一个inode,也就是不同分区可能会有相同的inode

删除文件其实是由两步组成:
1.在目录中将文件和inode的映射关系删除
2.将文件的硬链接数减1,如果减到了0,则将对应的磁盘文件释放掉。

软链接是通过名字引用另一个文件,可以理解为windows中桌面快捷方式的创建,是一个独立的文件,而硬链接不是一个独立的文件,而是在指定目录内部的一组映射关系:文件名<—>inode的映射关系

3.1.1 软链接

在Linux中,创建软链接(符号链接)可以使用 ln 命令,配合 -s 参数。软链接是指向另一个文件或目录的引用。

ln -s [目标文件或目录] [链接名称]

软链接可以跨文件系统,而硬链接不能。
如果目标文件被删除,软链接将变为“悬挂”状态,仍然存在但指向无效。
软链接的名称可以是相对路径或绝对路径。

3.1.2 硬链接

在Linux中,创建硬链接可以使用 ln 命令,不需要任何额外的参数。硬链接是指向同一物理文件的不同目录项。

ln [目标文件] [链接名称]

硬链接不能跨文件系统。
硬链接与原文件共享相同的 inode,因此它们是同一个文件的不同表示。
删除原文件并不会影响硬链接,因为它们仍然指向相同的数据。
目录通常不允许创建硬链接,除非使用特权权限。

4. 动静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。

静态库的本质是将库中的源代码直接翻译成为.o目标的二进制文件,然后打包在一起

静态库生成makefile文件参考

static-lib=libmymath.a

$(static-lib):Add.o Div.o Mul.o Sub.o
	ar -rc $@ $^
%.o:%.c
	gcc -c $<
#Test:Add.o Div.o Mul.o Sub.o TestMain.o
#	gcc -o $@ $^

.PHONY:output
output:
	mkdir -p mymath_lib/include
	mkdir -p mymath_lib/lib
	cp -f *.h mymath_lib/include
	cp -f *.a mymath_lib/lib

.PHONY:clean
clean:
	rm -rf *.o *.a mymath_lib

动态库生成Makefile文件参考

dy-lib=libmymath.so

$(dy-lib):Add.o Div.o Mul.o Sub.o
	gcc -shared -o $@ $^
%.o:%.c
	gcc -fPIC -c $<

.PHONY:output
output:
	mkdir -p mymath_lib/include
	mkdir -p mymath_lib/lib
	cp -f *.h mymath_lib/include
	cp -f *.so mymath_lib/lib

.PHONY:clean
clean:
	rm -rf *.o *.so mymath_lib

gcc默认是动态链接的,但个别库,如果你只提供.a,gcc也是没有办法,只能局部性的把你指定的.a,进行静态链接,其他库正常动态链接,如果加上-static,就必须要.a
在这里插入图片描述
运行动态库的方法:
1.直接安装到系统中
在这里插入图片描述

2.通过软连接,查找动态库
3.LD_LIBRARY_PATH,使用环境变量的方式,让系统找到自己的动态库
4.直接更改系统关于动态库的配置文件
在这里插入图片描述
动态库加载的原理

gcc -fPIC -c XXX.c

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2162800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件上传、amrkdown编辑器

一、文件上传 这里我以图片为例&#xff0c;进行上传&#xff0c;上传到阿里云oss&#xff08;对象存在中&#xff09; 首先&#xff0c;我们先梳理一下&#xff0c;图片上传的流程 1、前端选择文件&#xff0c;提交文件 前端提交文件&#xff0c;我们可以使用ElementUI中的…

python如何实现日期加减

首先通过import datetime&#xff0c;导入日期处理库。 然后把日期转化成datetime标准格式&#xff0c;使用datetime.datetime.strptime()方法将字符串格式的时间转化为标准格式。 其中"%Y/%m/%d %H:%M:%S"为time字符串的时间格式&#xff1a;Y为年&#xff0c;m为月…

思维导图在线工具哪家强?2024年最新评测

你用过思维导图工具吗&#xff1f;如果品尝需要对事情进行逻辑理顺操作或者需要增强记忆点那我比较推荐使用思维导图在线工具来解决这些问题。这篇文章我将介绍几款思维导图工具来提高我们的效率。 1.福晰思维导图 链接一下&#xff1a;https://www.pdf365.cn/naotu/ 这款思…

JVM的基本组成

一、JDK\JRE\JVM JDK: 全称 "Java Development Kit" &#xff0c;Java 开发工具包&#xff0c;提供 javac 编译器、jheap、jconsole 等监控工具;JRE: 全称"Java Runtime Environment"&#xff0c;Java 运行环境&#xff0c;提供Class Library 核心类库 JV…

【leetcode练习·二叉树】用「遍历」思维解题 I

本文参考labuladong算法笔记[【强化练习】用「遍历」思维解题 I | labuladong 的算法笔记] 257. 二叉树的所有路径 | 力扣 | LeetCode | 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点…

spring-boot、spring-cloud、spring-cloud-alibaba的常用依赖的依赖声明及pom文件

copy自若依 父工程pom文件&#xff0c;主要定义了依赖的版本号 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…

什么是电商云手机?可以用来干什么?

随着电商行业的迅速发展&#xff0c;云手机作为一种创新工具正逐渐进入出海电商领域。专为外贸市场量身定制的出海电商云手机&#xff0c;已经成为许多外贸企业和出海电商卖家的必备。本文将详细介绍电商云手机是什么以及可以用来做什么。 与国内云手机偏向于游戏场景不同&…

什么是启发式过滤(Heuristic Filtering)?

定义 启发式过滤是一种技术方法&#xff0c;利用解决问题的技术和算法来识别数据中的模式、趋势或特征。 这种方法通常涉及使用预测分析和近似方法&#xff0c;以便快速做出决策或对信息进行分类。 启发式过滤通常应用于反垃圾邮件软件、防病毒程序和人工智能等领域&#xff0…

openeuler22.03 LTS 源码编译安装nginx1.22.1

openeuler22.03 LTS 源码编译安装nginx1.22.1 下载安装包 #官网下载nginx1.22.1 wget http://nginx.org/download/nginx-1.22.1.tar.gz安装依赖包 #安装依赖包&#xff0c;NGINX是C语言写的&#xff0c;pcre-devel支持正则表达式&#xff0c;openssl 开启加密 [rootproxy ~]…

Java面向对象(类和对象)(自己学习整理的资料)

目录 一.面向对象思想 二.类和对象 三&#xff1a;定义类的步骤 四.创建对象 五.用Java代码写一个简单的登录系统 练习 六.关于类的方法 七.类的无参无返回值方法 八.方法的返回值 练习 关于方法调用问题 九.全局变量和局部变量 十.笔记 一.面向对象思想 就只关注参…

科研绘图系列:R语言分组堆积图(stacked barplot)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 堆积图是一种数据可视化图表,它通过将不同类别的数据以堆叠的形式展现在同一个图表中,来展示各个类别之间的相对大小和它们之间的总和。堆积图可以是柱状图、条形图或面积图的形式,其中每个堆叠的块或区域…

西门子S7-1200 PLC的配方功能

配方相关指令介绍工控人加入PLC工业自动化精英社群 配方功能主要使用4个指令&#xff0c;READ_DBL和WRIT_DBL用于对配方数据块的读写&#xff0c;RecipeExport和RecipeImport用于配方数据块和CSV文件之间的转化&#xff0c;下面分别介绍这4个指令的使用。 READ_DBL / / / / …

MMD模型及动作一键完美导入UE5-Blender方案(三)

1、下载并安装blender_mmd_tools插件 1、下载并安装Blender,Blender,下载Blender3.6,下载太新的版本可能会跟blender_mmd_tools不匹配 2、github下载blender_mmd_tools:https://github.com/UuuNyaa/blender_mmd_tools/ 3、Edit->Preference->Add ons->Install F…

【LinuxC高级】汇总

ls ls -l&#xff1a;显示文件的详细信息 ls -a&#xff1a;显示隐藏文件 ls -lh&#xff1a;文件大小单位显示 ls -i&#xff1a;显示文件的inode号 修改密码 passwd 用户名 su 用户名 -----> 用户名 su ----> 如果不加用户名&#xff0c;默认切换到超级用户 cd cd 路径…

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载 基于 ARM 的 Windows 10 请访问原文链接&#xff1a;https://sysin.org/blog/windows-10-arm/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;s…

MyBatis—Plus 快速上手【后端 22】

MyBatis-Plus 使用入门指南 前言 在Java的持久层框架中&#xff0c;MyBatis因其灵活性和易用性而广受欢迎。然而&#xff0c;随着项目规模的扩大&#xff0c;MyBatis的一些重复性工作&#xff08;如CRUD操作&#xff09;开始显得繁琐。为了解决这一问题&#xff0c;MyBatis-Pl…

Flink 高可用原理

Flink 高可用原理 Flink JobManager 高可用 加强了 Flink 集群防止 JobManager 故障的能力。 此特性确保了 Flink 集群将始终持续执行你提交的作业。 JobManager 高可用一般概念是指&#xff0c;在任何时候都有 一个领导者 JobManager&#xff0c;如果领导者出现故障&#xff…

失踪人口回归(明天开始继续更新学习内容)

从明天开始继续更新个人学习经验及收获&#xff0c;可能会直接从C入门开始&#xff0c;总结一下C在C的基础上增加的新语法。这篇就当作水贴算了&#xff0c;大家别点赞&#xff0c;留点赞给明天的文章&#xff0c;哈哈 我是安姐的修沟...........

html TAB、table生成

1. 代码 <!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 10px solid #ccc; padding: 30px; mar…

二叉树的基本概念(上)

文章目录 &#x1f34a;自我介绍&#x1f34a;简介&#x1f34a;树的定义树中的专业术语树的分类 &#x1f34a;二叉树的特性讲解 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介…