5.Linux基础IO

本文详细介绍了Linux系统中的文件管理和输入输出,包括系统调用如open、write和close,以及标准输入、输出和错误流。讨论了重定向的概念和实现,文件描述符的作用,以及文件在操作系统中的表示。同时,讲解了静态库和动态库的打包过程,强调了库函数与系统调用的区别。通过对文件系统的理解,阐述了文件的inode和数据块结构,以及硬链接和软链接的差异。

目录

open

系统调用 和 库函数

重定向

文件管理、理解文件系统

静态库 动态库怎么打包


文件  = 内容 + 属性

FILE*, c语言,软件

如何理解硬件和软件的关系

stdin,标准输入,键盘

stdout,标准输出,显示器

stderr,标准错误,显示器

stdin & stdout & stderr,c语言默认打开三个输出流,标准输入流,标准输出流和标准错误。

Linux之下一切皆文件。

为什么提供三个接口?实现人与计算机的交互(通过语言)。

1.如何输入输出

stdin & stdout & stderr,c语言默认打开三个输出流,标准输入流,标准输出流和标准错误。

系统文件输入输出接口

open

open,有两种使用方式

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

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

返回值:
成功:新打开的文件描述符
失败:-1

那如何理解mode_t呢?

和使用权限有关。

const char *str = "hello world\n";

write(fd, str, strlern(str));

close(fd);

系统调用 和 库函数

我们要回顾一下系统调用 和 库函数的概念,知道系统调用是系统提供的接口,而库函数呢?

是为了用户更好的使用对系统调用的二次封装。

其中,fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数(libc)。
而, open close read write lseek 都属于系统提供的接口,称之为系统调用接口。

可以认为f系列函数是对接口的二次封装。

3,4,5,6   文件描述符fd(files descration),在os层面就是一个整数,从0到n,

0:标准输入

1:标准输出

2:标准错误

本质是数组下标

os要管理文件,结构体,多个文件多个结构体,链表组织

struct file{

//文件的属性信息

//文件的缓存和存储位置

}

进程是task_struct,进程访问文件,进程对文件 1:n

struct file*fd_array  [结构体指针数组],pcb有指针fs指向其中。(struct file_struct中的)

什么是文件描述符

本质是数组下标,默认从小的分配,默认从3开始

通过结构体和函数指针实现面向对象

重定向

重定向:本来应该输出到显示器上的内容,输出到了文件当中,其中,fd=1。这种现象叫做输出
重定向。常见的重定向有:>, >>, <

我们来看这一代码,我们会发现printf和fprinf打印了两次。

int main()
{
  int fd = open("log.txt",O_CREAT | O_APPEND | O_WEONLY, 0644);
  if(fd < 0){
    perror("open error");
    return 1;
}
  const char *str = "hello world: write\n";
  const char *str1 = "hello world: print\n";
  const char *str2 = "hello world: fprint\n";
  
  write(1,str,strlen(str));
  printf("%s",str1);
  fprintf(stout,"%s",str2);

  fork();

  fflush(stdout);
}

输出地一般有两种,

显示器,行缓冲

和文件,全缓冲

缓冲区,本质是一块内存

重定向,目的地发生变化,收缓冲影响。库函数受影响,缓冲区在库函数提供的。

用户级缓冲区,c标准库提供。(语言给我们提供的缓冲区)

先关闭1的重定向,

不关闭用dup,有dup和dup2,我们在这里学习dup2。

dup2(oldfd,newfd),内容的拷贝

dup2(fd,1)

close(fd)

数组内容的拷贝,内容的改变。

文件管理、理解文件系统

文件  = 内容 + 属性

                                                             一个文件

(1)inode{

属性集合

}

(n数据块)block{                  4kb为单位保存的

内容

}

file system{

基本情况

空间一共多大

已经被使用&&没有被使用

inode

block

group(高度概括)

方法

}

理解硬盘,里边是光盘(两面都是光的)6磁头,机械臂杆

盘面,柱面,扇区

硬盘想象成大数组,将对硬盘进行管理的问题转化为对数组进行管理的问题。 

硬盘太大了,划分空间,(用文件系统)便于管理。(分区)

 inode文件的属性   (个数是确定的)

Data block 数据

 文件:inode: block = 1:1:n

inode id ,标识一个inode,是唯一的

目录是文件,有inode和block

怎么分配inode id

由i位图决定,多少id就是多少0 ,00000.......00000,比如第五个给了,就是00001......000。

同理b位图

想象为数组

通过位图知道inode和block的使用情况。

删除把1变为0.删除成本低

目录也是文件 = inode + 数据块(文件名 + inode映射关系)

硬链接

不是单独文件。和指向的文件共享一个inode。

是什么呢?

文件名和映射关系

软链接ln -s(本质上就相当于一个快捷方式)

是不是独立文件,是,有独立inode

stat 更多文件信息

静态库 动态库怎么打包

静态库.a      静态链接,将对应的代码拷贝进bin,体积比较大,bin可移植性强

链接的时候纳入进来

动态库 .so     动态库体积小,依赖库   运行的时候才加载

libc.so.6   根据命名规则,去掉lib和第一个点后边,就是库的名字,所以是c库。

使用需要提供

一批头文件:有什么方法可以使用,接口参数是什么意思

一个,多个库文件:具体的实现,供我们动静态链接

链接的本质:将你代码生成的.o文件进行打包

ar -rc libmypath.a myadd.o mysub.o      这一步是将myadd.o mysub.o打包成libmypath.a(打包库文件)

 最后可打包成如图文件进行传输

 

### 如何在 balena.io 平台上安装 Linux 系统 要在 balena.io 平台上成功安装 Linux 系统,可以按照以下方法操作: #### 准备工作 balena.io 提供了一种简单的方式来管理和部署基于 Linux 的操作系统到各种硬件设备上。为了完成这一过程,需要先熟悉 Ubuntu Linux 基础知识以及相关工具的使用[^1]。 #### 安装 Balena Etcher 工具 Balena Etcher 是一款用于烧录镜像文件到 SD 卡或其他存储介质上的工具。可以通过以下命令来安装它: ```bash sudo yum install -y balena-etcher-electron ``` 如果需要卸载该工具,则可执行如下命令: ```bash sudo yum remove -y balena-etcher-electron sudo rm /etc/yum.repos.d/etcher-rpm.repo sudo yum clean all sudo yum makecache fast ``` 以上步骤适用于 Red Hat 或 CentOS 类型的操作系统环境下的安装与清理流程[^2]。 #### 配置开发环境 对于特定平台如 NVIDIA Jetson Nano 设备,在其桌面端开启 LXTerminal 终端程序之后,更新包索引并安装必要的依赖项是非常重要的一步。具体指令如下所示: ```bash sudo apt-get update sudo apt-get install python3-pip cmake libopenblas-dev liblapack-dev libjpeg-dev ``` 这些库支持后续可能涉及的数据科学计算或者图像处理等工作负载需求[^3]。 #### 创建虚拟环境 推荐为项目单独设立 Python 虚拟环境以便隔离不同项目的依赖关系冲突等问题。以下是创建方式之一: ```bash $ sudo pip install virtualenv virtualenvwrapper ``` 这会全局范围内安装 `virtualenv` 及其配套插件 `virtualenvwrapper`, 方便管理多个独立的Python运行时版本及其对应的第三方模块集合[^4]。 完成上述准备工作后, 用户可以根据目标嵌入式装置的具体规格下载合适的官方预构建OS映像(image),再利用之前提到过的Etcher软件将其写入物理媒介当中去实现最终的目标——即把定制化后的Linux发行版移植至实际硬件之上运作起来.
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学c的长弓狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值