5.Linux基础IO

Posted 学c的长弓狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.Linux基础IO相关的知识,希望对你有一定的参考价值。

目录

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(打包库文件)

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

 

以上是关于5.Linux基础IO的主要内容,如果未能解决你的问题,请参考以下文章

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us

[vscode]--HTML代码片段(基础版,reactvuejquery)

golang代码片段(摘抄)

为啥这段代码会泄露? (简单的代码片段)

PHP代码-psysh调试代码片段工具