linux 文件io

一:

在linux下,fwrite和fread都是对一个file*(文件流指针)进行操作,这个指针指向一个文件流缓冲区,默认大小所所所所是是8192byte

在读写的过程中,如果读10个字符,一个都读完或者是1次读取一个1个读10次,哪一种效率比较高,当然是前一种,这涉及到硬件性能的知识,我们在读取或者写入数据的时候,我们都采用一种探针寻址计数,这是一种硬性能(当然还有软性能),探针多次移动必然会耗费更多的性能

首先,我们针对一个程序看看Windows和linux是如果执行的

eg:   printf(“hello world”);

那么这么一句话是如果显示到屏幕上的呢?

在windows :

1:首先处于应用层,我们执行fread、fwrite,操作file*,将字符串存在文件流缓冲区中,之后向底层传递

2:传到kernel层,kernel层有一个内核缓冲区,于是字符串存在了内核缓冲区中,之后再次向底层传递,这里由文件流缓冲区到内核缓冲区发生了一次中转

3:传到驱动层(硬件层),iowrite调用显示设备,将字符串输出到显示器上

在linux:

大体和windows相同,只不过linux没有文件流缓冲区,所以,在应用层到内核层转换中直接存到内核缓冲区了,不需要发生一次中转

在效率上看

从应用层看,Windows效率高,linux需要一个个写入,但是linux没有写入数量的限制,Windows限制8192

从内核层看,linux效率高,因为少了一次中转,

读写的时候,除了read时候Windows多了一次中转,别的说不好谁的效率高。最高的性能往往是和cpu有关的

二:pcb的概念

pcb(进程控制块)

处于内核中,描述进程管理的,每一个进程都会存在一个自己的PCB

主要包含两个结构体

task_struct结构体,主要就是一个数据结构

它记录了一下几个类型的信息:

1.状态信息,例如这个进程处于可执行状态,休眠,挂起等。

2.性质,由于unix有很多变种,进程有自己独特的性质。

3.资源,资源的链接比如内存,还有资源的限制和权限等。

4.组织,例如按照家族关系建立起来的树(父进程,子进程等)。

files_struct(一个point)指向一个文件描述符表,其实就是一个int类型的数组

一个文件打开的时候默认打开3个文件描述符

STDIN_FILENO     0

STDOUT_FILENO   1

STDERR_FILENO   2

新产生的文件描述符默认未使用最小

fd=open(argv[index],O_RDONLY| O_CREAT,0664)

OPEN种flag值

O_RDONLY

O_WRONLY

O_RDWR

三:冗错处理

perror(),把错误的信息输出出来,(内置错误处理)

errno是处于进程用户区间的一个全局变量,当报错的时候errno会被赋值一个整数表示错的编号,

perror找到errno的值,找对对应的错误信息(一个字符串),并输出

四:

对于touch的文件默认权限666,gcc后的可执行文件默认权限777,如果umask不为0

那么则由默认权限&(~umask)

 首先要明确一点,在Linux系统中一切都可以看成是文件,你的文档是文件、程序是文件、设备也是文件、显示屏、键盘、网口都可以看做是文件,而且在linux中也确确实实是这样。而文件又可分为:普通文件、目录文件、链接文件和设备文件。
  文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都要通过文件描述符进行操作。
  一个进程默认打开3个文件描述符:

STDIN_FILENO   0
STDOUT_FILENO  1
STDERR_FILENO   2

POSIX标准规定:新打开文件返回文件描述符表中未使用的最小文件描述符。

 文件描述符表中的每一项,都对应一个file struct结构体,结构体的第一项flag,表示文件的属性(W,R,阻塞非阻塞),第二项pos是一个指针,指向磁盘文件,表示读写指针位置

最大文件打开个数


  在编写文件操作的或者网络通信的软件时,可能会遇到“Too many open files”的问题。这主要是因为文件描述符是系统的一个重要资源,虽然说系统内存有多少就可以打开多少的文件描述符,但是在实际实现过程中内核是会做相应的处理的,一般最大打开文件数会是系统内存的10%(以KB来计算)(称之为系统级限制),查看系统级别的最大打开文件数可以使用cat /proc/sys/fs/file-max命令查看。
  相关命令介绍:
  查看当前系统允许打开最大文件个数

cat /proc/sys/fs/file-max
当前默认设置最大打开文件个数1024

  查看修改限制命令的使用方法

ulimit -a

  修改默认设置最大打开文件个数为4096

ulimit -n 4096

原文地址:https://www.cnblogs.com/13224ACMer/p/6381224.html