当前位置: 首页 > news >正文

linux部分c应用部分基础知识

首先linux中所有的操作都是基于文件操作实现的,这是基准。

1.编写程序过程中的注意事项

1.关于goto关键字的说法,在应用层中goto关键字是不提倡使用的,它会是逻辑混乱不好调试与梳理逻辑结构,但是在驱动中goto是很常见的,关于这个关键字使用的侧重点是他会统一的释放资源。(在linux驱动中会按照一定的顺序申请资源,如果有一步申请失败或者是操作失败,会在函数的尾部统一释放资源)应用层与驱动层的侧重点不同。

2.在Linux中关于涉及到资源的这一部分,每次都要考虑到操作失败与资源申请失败的情况。

3.关于函数的linux部分的函数调用可以查看man手册。

2.文件操作部分

首先要区分系统调用与库调用,要搞清楚的是系统调用是内核提供给应用层的,也就是系统调用一端连接的是内核部分实现的文件操作,另外一段连接的是应用层操作。库函数对文件的操作是基于系统调用之上的,库函数的存在是为了兼容不同的操作系统,给用户一个统一的接口,其次对于linux而言,库函一般是带有缓冲的,减少从用户态到内核态的切换次数。

1.系统调用函数(文件io)

系统调用的函数 open("test.txt", O_RDWR | O_CREAT, 0644); write(fd, "aaaaaa", 6);

open("test2.txt", O_RDWR | O_CREAT, 0644);read(fd, buf, 1024);write(fd2, buf, 6);系统调用对文件的操作都是基于文件描述符进行操作的(fd,fd),其中的文件描述符也是一种资源,有数量限制,使用ulimit-n命令可以查看,自已申请分配的文件描述符一般都是从3开始的,0:标准输入,1:标准输出,2:标准错误。

可以使用strerrorperror,这两个函数来打印出函数的错误信息。

使用O_APPEND打开文件时,使用lseek不能改变写的位置偏移量,并且读的位置偏移量还是开头部分。

当读取文件时,O_APPEND标志并不会影响读位置偏移量,即使使用了 O_APPEND

标志,读文件位置偏移量默认情况下依然是文件头

一个进程内多次 open 打开同一个文件,在内存中并不会存在多份动态文件,一个进程内多次open打开同一个文件,不同文件描述符所对应的读写位置偏移量是相互独立的,

复制得到的文件描述符与原文件描述符都指向同一个文件表,所以它们的文件读写偏移量是一样的,可以在不使用O_APPEND标志的情况下,通过文件描述符复制来实现接续写。

2.标准io(c标准库)

1.文件io是基于文件描述符来操作的,标准io是基于file*指针进行操作的
FILE 是一个结构体数据类型,它包含了标准I/O库函数为管理文件所需要的所有信息,包括用于实际 I/O 的文件描述符、指向文件缓冲区的指针、缓冲区的长度、当前缓冲区中的字节数以及出错标志等。FILE 数据结构定义在标准 I/O库函数头文件stdio.h中。
fopen("./test_file","w");
因为fread();的返回值无法判断是读取完成还是读取错误,等小于要读取的个数时,需要使用ferror();函数来判断是不是读取错误。feof(file)用于判断是否读取到文件尾。
库函数 ferror()用于测试参数stream所指文件的错误标志,如果错误标志被设置了,则调用ferror()函数 将返回一个非零值,如果错误标志没有被设置,则返回 0

库函数 clearerr()用于清除end-of-file标志和错误标志,当调用feof()ferror()校验这些标志后,通常需要清除这些标志,避免下次校验时使用到的是上一次设置的值,此时可以手动调用 clearerr()函数清除标志。

2. 关于printf()fprintf()dprintf()sprintf()snprintf(),的区别:printf()函数用于将格式化数据写入到标准输出;dprintf()fprintf()函数用于将格式化数据写入到指定的 文件中,两者不同之处在于,fprintf()使用FILE指针指定对应的文件、而dprintf()则使用文件描述符fd指定 对应的文件;sprintf()snprintf()函数可将格式化的数据存储在用户指定的缓冲区buf中。

关于scanf(),fscanf(), sscanf(),区别:scanf()将用户输入(标准输入)的数据进行格式化转换并进行存储,fscanf()函数从指定文件中读取数据,作为格式转换的输入数据,文件通过FILE 指针指定,sscanf()将从参数str所指向的字符串缓冲区中读取数据,作为格式转换的输入数据.

3.io缓冲部分

1.文件io缓冲部分

read()和 write()系统调用在进行文件读写操作的时候并不会直接访问磁盘设备,而是仅仅在用户空间缓冲区和内核缓冲区(kernel buffer cache)之间复制数据,内核稍后会将数据写入到磁盘设备中,具体是什么时间点写入到磁盘,这个其实是不确定的,由内核根据相应的存储算法自动判断。也可以使用fsync()fdatasync()、sync()手动刷新到磁盘中,fsync()将参数fd 所指文件的内容数据和元数据写入磁盘,fdatasync()仅将参数fd 所指文件的内容数据写入磁 盘,并不包括文件的元数据;sync()会将所有文件I/O 内核缓冲区中的文件内容数据和元数据全部更新到磁盘设备中.也可以在open文件时加入参数O_DIRECT,其有一些限制,不过这个一般不会用到

2.标准io缓冲部分

虽然标准io是对文件io的进一步封装,但在效率、性能上标准 I/O要优于文件I/O,其原因在于标准I/O实现维护了自己的缓冲区,我们把这个缓冲区称为 stdio 缓冲区。C 语言提供了一些库函数可用于对标准I/Ostdio缓冲区进行相关的一些设置,包括setbuf()setbuffer() 以及 setvbuf();

int setvbuf(FILE *stream, char *buf, int mode, size_t size);其参数解释:streamFILE指针,用于指定对应的文件,每一个文件都可以设置它对应的stdio 缓冲区。buf如果参数buf不为NULL,那么buf指向size大小的内存区域将作为该文件的stdio 缓冲区,如果 buf等 于 NULL,那么stdio库会自动分配一块空间作为该文件的stdio缓冲区(除非参数mode 配置为非缓冲模 式)。mode参数mode用于指定缓冲区的缓冲类型,可取值如下:

1._IONBF不对I/O进行缓冲(无缓冲)。意味着每个标准I/O函数将立即调用write()或者read(),并且忽略 bufsize参数,可以分别指定两个参数为NULL0。标准错误stderr默认属于这一种类型,从而保证错误信息能够立即输出。
2._IOLBF采用行缓冲I/O。在这种情况下,当在输入或输出中遇到换行符"\n"时,标准I/O才会执 行文件 I/O操作。对于输出流,在输出一个换行符前将数据缓存(除非缓冲区已经被填满),当输 出换行符时,再将这一行数据通过文件 I/O write()函数刷入到内核缓冲区中;对于输入流,每次读 取一行数据。对于终端设备默认采用的就是行缓冲模式,譬如标准输入和标准输出。
3._IOFBF采用全缓冲I/O。在这种情况下,在填满stdio缓冲区后才进行文件I/O操作(readwrite)。 对于输出流,当 fwrite写入文件的数据填满缓冲区时,才调用write()stdio缓冲区中的数据刷入 内核缓冲区;对于输入流,每次读取 stdio缓冲区大小个字节数据。默认普通磁盘上的常规文件默 认常用这种缓冲模式。
size指定缓冲区的大小。
void setbuf(FILE *stream, char *buf);=》setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
void setbuffer(FILE *stream, char *buf, size_t size);=》setvbuf(stream, buf, buf ? _IOFBF : _IONBF, size);
标准输出默认是行缓冲模式,只有输出了换行符时,才会将换行 符这一行字符进行输出显示(也就是刷入到内核缓冲区),在没有输出换行符之前,会将数据缓存在 stdio 缓冲区中。
无论我们采取何种缓冲模式,在任何时候都可以使用库函数 fflush()来强制刷新(将输出到stdio缓冲区中的数据写入到内核缓冲区,通过 write()函数)stdio缓冲区,该函数会刷新指定文件的stdio 输出缓冲区,关闭文件也会进行刷新(如果使用_exit_Exit()终止程序则不会刷新)

4.两者互相转化

库函数 fileno()可以将标准I/O中使用的FILE指针转换为文件I/O中所使用的文件描述符,而 fdopen() 则进行着相反的操作,int fileno(FILE *stream);

FILE *fdopen(int fd, const char *mode);在这样使用的时候要注意刷新的问题。

3.文件属相部分

在windows中文件是以.后缀进行区分的,在linux中文件不是以.后缀进行划分的,不过文件终归是要给人看的,所以还是得按照正常的格式进行编写。

在linux中可以通过stat,ls命令查看文件的属性。' - ':普通文件 , ' d ':目录文件 , ' c ':字符设备文件 , ' b ':块设备文件 , ' l ':符号链接文件 , ' s ':套接字文件 , ' p ':管道文件

关于stat命令与file命令的区别:stat命令:stat读取的是文件系统的 inode 信息,包括权限、大小、时间戳、设备号等,它不关心文件内容,file命令:

http://www.jsqmd.com/news/1302894/

相关文章:

  • 专业体育看台膜结构厂家怎么选?行业优选厂商解析,膜结构/遮阳棚/电动车棚/景观棚/大型膜结构,体育看台供应商有哪些 - 品牌推荐师
  • 广州中小微企业主经济犯罪辩护律师哪个优秀:【法纳刑辩】卓越服 - 晚香时候
  • AI辅助学术写作:工具链与高效工作流实践
  • 广州中小微企业主经济犯罪辩护律师哪个靠谱:【法纳刑辩】顶尖团 - 松梢月冷
  • RevokeMsgPatcher内存补丁技术深度解析:实现Windows平台消息保留的完整解决方案
  • 广州民营企业主经济犯罪律师哪个靠谱:【法纳刑辩】精英汇聚 - 云溪自乐
  • VLAN划分方法:基于端口、MAC地址的划分实操教程
  • 8月技术展望:AI后端架构师的下一个月重点方向与学习计划
  • 5分钟掌握Mermaid Live Editor:免费在线图表工具的终极指南
  • ️ 2026深圳管道疏通哪家好?5家本地正规品牌实测对比+避坑指南 - 园子一号
  • Anaconda最新版2026版安装教程
  • 如何在3分钟内用Mermaid Live Editor创建专业图表:免费在线数据可视化工具终极指南
  • CrisperWhisper2.0_large实战教程:3分钟上手专业级语音识别,支持多语言与实时时间戳
  • 广州民营企业主经济犯罪律师推荐:【法纳刑辩】胜诉保障 - 秋山寄远
  • Windows防撤回神器:RevokeMsgPatcher让微信QQ消息永不消失
  • 别只打印 content:蓝耘元生代 MaaS 流式输出、思维链与 Token 陷阱实战
  • 电商场景:商品文案、导购、评论分析
  • 终极指南:如何用OpCore-Simplify轻松打造完美Hackintosh配置
  • 从 B 站视频到 Obsidian 知识库,这套工作流帮我总结全网视频
  • 文件伪装工具apate:3分钟学会如何快速绕过格式限制
  • Jenkins容器部署微服务时出现daemon socket、permission denied等问题(天机学堂)
  • 3步掌握Umi-OCR:免费离线文字识别软件的完整使用指南
  • 3分钟上手LLaMA-Factory:从模型微调优化到高效推理部署
  • 蓝耘 MaaS 的「思考成本」怎么样?我写了个剖析器,把 6 个模型扒了个底朝天
  • 电子课本一键离线化:tchMaterial-parser智能解析工具使用指南
  • hekate USB传输功能:告别SD卡拔插的终极文件管理方案
  • cppm题库怎么领取? - 众智商学院官方
  • AI教材写作:低查重率实战技巧与工具链优化
  • # 贴标机送标轴为什么常用 PLF060-5 配 400W 伺服:从辊速、惯量到同步误差分析
  • Mermaid Live Editor:免费在线图表工具终极指南,5分钟创建专业流程图