Linux环境高级编程初学复盘
Linux下的文件IO系统调用
文件与文件描述符
1.文件扩展名
Linux下有许多文件扩展名,其是人为规定的一种文件后缀,一般设定如此,这样设置可以让自己和其他人更加方便地根据该文件扩展名来识别该文件类型与作用等信息
.tar,.tat.gz,.tgz,.zip,.tar.bz 表示压缩文件,通过tar,gzip,unzip命令创建
.sh 表示shell脚本
.pl perl语言文件
.py python语言文件
.conf 系统服务配置文件
.c c语言文件
.h 头文件
.cpp c++源文件
.so 动态库文件
.a 静态库文件
2.文件类型
在linux下可以通过ls -l 查看文件的详细信息,文件详细信息的第一个字母及代表文件的类型
普通文件(-),目录文件(d),符号链接(l),字符设备(c),块设备(b),管道(p),套接字socket(s)
3.文件描述符
Linux系统下一切皆文件,所以linux内核为管理已经打开的linux文件,引入了一个文件描述符文件(fd)(file descriptor)来指定这个文件,其作用类似于c语言中的指针,有指代某一对象的作用,用户可以通过对该文件描述符对某个文件进行读与写等操作,第一次调用进程或线程时,系统默认会打开三个文件描述符,即0(标准输入),1(标准输出),2(标准出错),所以用户第一个创建的文件描述符一定为3
文件描述符 | 用途 | POSIX文件描述符 | 标准I/O文件流 |
---|---|---|---|
0 | 标准输入 | STDIN_FILENO | stdin |
1 | 标准输出 | STDOUT_FILENO | stdout |
2 | 标准出错 | STDERR_FILENO | stderr |
文件io操作函数
1.在linux下基于文件描述符对文件进行操作一般使用的系统调用有:
open(文件绝对路径(*path),文件的操作状态(oflag),…(可选项)),其作用为通过该绝对路径,以什么样的操作状态去读取该函数(只读,只写,读写等),其返回值为一个文件描述符(fd),该fd指向该文件
read(文件描述符(fd),将文件读取到的存储空间名(buf),存储空间大小(sizeof(buf))),该函数是通过文件描述符对指向的文件进行读操作,读取里面的文件内容到一个存储空间中去(自定义),printf(“%s\n”,buf)打印读到的文件内容,其返回值是一个整数,其含义是指从文件中读到多少个字节的内容,不过可能存在文件偏移量读取不到内容的情况(由于写时,文件的偏移量会发生变化,如果不改变该文件偏移量,读时会自动从该文件偏移量位置进行读取,一般写操作结束后,文件偏移量会置于文末,所以很有可能read时会提示读到0字节的情况)
write(文件描述符(fd),写入的数据内容(buf),写入的数据大小(sizeof(buf))),该函数通过文件描述符对文件进行写操作,将写入的数据内容写入到文件中,其返回值为一个整数,和read一样,提示向文件中写了多少个字节的数据
create(文件名,文件权限),该函数通过创建一个新的文件并返回一个指向其的文件描述符(fd),该函数少用,一般使用open在oflag选择参数来创建文件,并定义后面的文件权限
close(文件描述符)该函数用于关闭文件描述符,释放内存空间
lseek(文件描述符,相对于文件偏移后位置的偏移量(offset),文件偏移后的位置(whence)),该函数可以修改文件的偏移量,一般写操作后,都会将文件偏移量从新设置,以便后期read可以读到
dup(文件描述符(new))和dup2(要重定向到该文件中的文件描述符(new),被重定向的文件的文件描述符(old)),这两个函数都是将文件重定向
sta()和fstat(),这两个函数是用于返回文件或目录的详细信息的(暂时未用到)
access(文件名,要测试的权限),该函数用于测试权限位,可选读写执行与是否存在等权限
unlink()该函数用于删除文件
rename(旧文件名,新文件名)对文件进行重命名
2.linux下对文件夹操作的系统调用有
函数 | 函数说明 |
---|---|
mkdir | 创建文件夹 |
rmdir | 删除文件夹 |
opendir | 打开文件夹 |
readir | 读文件夹 |
closedir | 关闭文件夹 |
chdir | 改变工作目录 |
文件出错与出错处理
linux下出错的原因有很多种,所有有一个变量(errno)来保存文件出错的标号,来标识文件出错的原因序号,然后我们在程序中一般需要打印文件出错的原因,linux中有两个出错处理的函数perror和strerror,由于perror的输出格式过于固定,而且只能打印到标准输出上所以一般我们在出错处理时,一般会使用strerror来处理,使用printf(“%s\n”,strerror(errno)),来打印出错原因
学习过程中碰到的细节知识点
1.通过宏定义 #define 将文件绝对路径简化为一个宏定义,方便引用
2.strlen()函数可以求字符串的长度等,strlen与sizeof的区别(待补充)
3.int main(int argc,char**argv),其中argc是命令行参数个数,argv是一个二维数组,存储的是命令行参数(存储在内存空间中的命令参数区)
4.自定义一个buf空间,如果没有对buf空间进行初始化,buf空间里面则存的是垃圾文件,read的时候可能出现乱码,所以在用到buf前。即read前,需要对buf进行初始化,使用一个初始化函数memset((初始化的存储空间名)buf,(一般设置0)0,(初始化的存储空间大小)sizeof)
5.goto:跳转到cleanup,进行文件描述符的关闭,返回等操作
6.return()与exit(),在普通函数中,return会使函数提前结束,但不影响main函数的执行,但在普通函数中,如果使用exit(),则会两个函数都退出,该普通函数和程序均退出,在main函数中调用return()和exit()函数都会使程序退出
7.获取一个文件夹目录的内容,一般定义一个结构体指针来接收