Linux:基础IO

Posted 银背欧尼酱

tags:

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


前言

本文将为大家介绍基础IO的相关知识,让我一起来学习吧。


一,复习C语言当中学习的文件接口操作

FILE *fopen(const char *path,const char *mode);
	path:待要打开的文件
	mode:以何种方式打开
		r:可读方式打开
		r+:可读可写方式打开
		w:可写方式打开
		w+:可读可写方式打开,如果文件不存在,则创建文件。如果是打开了一个已经存在的文件,则截断文件(清空文件内容)
		a:追加写,但是不可以读。如果文件不存在则创建文件,如果文件存在,则在文件的末尾开始追加写。
		a+:追加写,可以读。如果文件不存在则创建文件,如果文件存在,则在文件的末尾开始追加写。
		
		返回值:
			成功:返回文件流指针FILE
			失败,则返回NULL
			
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
	ptr:将从文件读到的内容保存在ptr指向的空间当中
	size:定义读文件时,一个块的大小,单位为字节
	nmemb:期望可以从文件中读多少块
	stream:文件流指针
		返回值:
			返回的是真正读取到块的个数
			常见用法:将一块的大小定义为1字节,nmemeb就可以代表我们期望读多少字节,返回的含义,也是读到了多少字节。
			
size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);
	ptr:想往文件中写什么内容
	size:定义往文件中写的块的大小,单位为字节
	nmemb:期望写多少块
	stream:文件流指针
		返回值:
			返回成功:写入到文件当中块的个数
			常见用法:将一块的大小定义为1字节,nmemeb就可以代表我们想写多少字节,返回值为成功写入的字节数量

int fseek(FILE *stream,long offset,int whence);
	stream:文件流指针
	offset:偏移量
	whence:将文件流指针偏移到什么位置
		SEEK_SET:定义文件流指针到文件头部
		SEEK_CUR:定义文件流指针到当前位置
		SEEK_END:定义文件流指针到文件末尾
	作用:移动文件流指针指向的位置
	
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
系统调用的文件操作接口:
打开的文件存在,则使用下面的接口
int open(const char *pathname,int flags,mode_t mode);
	pathname:待要打开的文件
	flags:以何种方式打开,有且只能存在一种,并且必须有
        0_RDONLY:只读方式
        0_WRONLY:只写方式
        0_RDWR:读写方式
	可选项:
        0_TRUNC:截断文件(清空文件内容)
        0_CREAT:文件不存在则创建文件
        0_APPEND:追加的方式
        0_EXCL | 0_CREAT : 如果文件存在,则打开文件失败
     使用按位或的方式进行组合
     0_RDWR | 0_CREAT | 0_APPEND
     本质上内核是使用位图的方式来表示每一种方式的
     mode:当创建或打开一个新文件时,则需要给文件设置权限,设置权限的时候,则传递一个8进制的数字就可以了
   返回值:
   		成功:返回一个文件描述符
   		失败:返回-1

ssize_t read(int fd,void *buf,size_t count);
	fd:文件描述符
	buf:将文件内容读到buf指向的空间当中
	count:期望读多少字节
  返回值:
  	返回读到的字节数量
  	
ssize_t write(int fd,const void *buf,size_t count);
	fd:文件描述符
	buf:将buf指向的内容写到文件中去
	count:期望写多少字节
  返回值:
  	返回写入的字节数量
  	
off_t lseek(int fd,off_t offset,int whence);
	fd:文件描述符
	offset:偏移量
	whence:
		SEEK_SET:定义文件流指针到文件头部
		SEEK_CUR:定义文件流指针到当前位置
		SEEK_END:定义文件流指针到文件末尾

二,文件描述符

文件描述符本质上就是一个整数,是一个从0开始的整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件,于是就有了file结构体,表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每一个进程都有一个指针*files,指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针。所以,本质上,文件描述符就是files_struct包含数组的下标。所以只要拿着文件描述符,就能找到对应的文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhG2jUVA-1628669830113)(https://i.loli.net/2021/08/11/1EstfVcWAJFpYjN.png)]

默认的三个文件描述符:标准输入0,标准输出1,标准错误2。一个文件流指针只能保存一个文件描述符。

三,静态库和动态库

静态库和动态库都是程序代码的集合,将代码集合封装在了库文件当中,提供给调用者使用:

动态库:

​ 特征:

​ win : 后缀为 .dll

​ linux : 前缀 : lib 后缀为: .so

​ 生成:

​ 使用gcc/g++编译命令,需要用到两个命令行参数

​ —fPIC : 产生位置无关的代码

​ —shared : 产生共享库

使用:

​ gcc/g++的命令行参数:

​ -L [path] : 指定当前链接库文件所在路径

​ -l[库文件名称(去掉前缀,去掉后缀的名称)]:链接某个库文件

动态库的环境变量:

​ LD_LIBRARY_PATH

都有哪些方式可以使自己的可执行程序找到自己依赖的动态库

​ 1.将动态库放到可执行程序的路径下

​ 2.配置LD_LIBRARY_PATH环境变量(临时)

​ 3.放到系统库的路径下,/lib64 :对系统环境变量进行操作,极其不推荐

静态库:

​ 特征:

​ win : 后缀为 .lib

​ linux : 前缀 : lib 后缀为: .a

​ 生成:

​ 注意点:使用目标程序进程编译生成

​ 第一段:使用gcc/g++将源代码编译成为目标文件(.o文件)

​ 第二段:使用ar -rc命令编译目标文件生成静态库

总结

以上就是本文内容,希望对大家有所帮助。

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

Linux基础IO篇

20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

逆向及Bof基础实践

20155307刘浩《网络对抗》逆向及Bof基础

20155311高梓云《网络对抗》逆向及Bof基础

20145301赵嘉鑫《网络对抗》逆向及Bof基础