嵌入式开发Day08(2024.03.24)

Linux 系统调用

一切皆文件

Linux系统文件io接口

关于文件io

   Linux系统下用于对文件操作的库函数叫做文件io,主要包括 open()/read()/write()/lseek()相应的系统调用

文件描述符

  文件描述符是一个非负的整数,当打开一个已存在文件或者创建一个新文件时,内核向进程返回一个文件描述符。
  每个进程运行后,操作系统会默认打开三个文件,标准输入、标准输出、标准错误输出、文件描述符分别为0、1、2

  • 标准输入对应设备一般为键盘
  • 标准输出和标准错误输出设备一般为显示器
  • 通过重定向可以将标准输入、标准输出、标准错误输出输入到文件中

查看相关函数帮助文档

通过帮助文档查看函数:man 2 函数名
man 2 open
在这里插入图片描述
在这里插入图片描述

函数错误处理与errno

  errno是linux操作系统中用于存储错误编码的全局变量,存储当前函数的错误信息,错误编码在linux中定义可以通过 man errno查看,打印函数错误信息可以使用perror()\strerror();

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// int open(const char *pathname, int flags);
// int open(const char *pathname, int flags, mode_t mode);
int main(int argc,char  *argv[]){//此处第二个参数为二维数组
	int fd;
	if(argc !=2){
		fprintf(stderr,"Usage : <%s> <pathname>\n",argv[0]);
		return -1;
	}
	fd=open(argv[1],O_RDONLY);
	if(fd == -1){
		
		perror("open():");
		return -1;	
	}
	printf("fd = %d \n",fd);
	close(fd);  //open成功后必须有close
	return 0;
}

root@wangjudealy:/learn/day08# ./a.out /learn/day08/passwd 
fd = 3 
root@wangjudealy:/learn/day08# ./a.out /learn/day08/passwd1 
open():: No such file or directory

Linux标准io接口

  标准io接口时有别于文件io的另一套接口,具有如下特点:

  • 标准IO可以跨平台,文件IO只能在linux上运行
  • 标准io自带缓冲区,有更高的IO效率
  • 标准io提供丰富的操作文本信息接口
  • 标准io底层需要依赖于文件io
  • 在Linux下,标准io是属于glibc库的一部分

glib简介:  glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于glibc囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演进的几个重要里程碑,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。
glibc是一种按照LGPL许可协议发布的,自由的,公开源代码的,方便从网络下载的C的编译程序。GNU C运行期库,是一种C函数库,是程序运行时使用到的一些API集合,它们一般是已预先编译好,以二进制代码形式存在Linux类系统中,GNU C运行期库通常作为GNU C编译程序的一个部分发布。
glibc最初是自由软件基金会(FSF)为其GNU操作系统所写,但当前最主要的应用是配合Linux内核,成为GNU/Linux操作系统一个重要的组成部分。

流与FILE对象

流:分为文本流和二进制流
FILE对象:即FILE指针。每个使用的文件都会在内存中开启一个区域,存放文件相关信息,这些信息保存在一个结构体变量中,该结构体由系统定义,取名为FILE。
FILE结构体定义在/usr/libio.h 中 struct_IO_FILE
  标准IO库都是围绕流进行的,用 FILE* 来表示

标准输入、标准输出、标准错误输出

  标准IO预定义了三个流对象指针,在程序运行时自动打开。
  标准输入:指针名   stdin   文件描述符 0
  标准输出:指针名   stdout   文件描述符 1
  标准错误输出:指针名   stderr   文件描述符 2
**##😗*printf函数操作的是stdout,在输出时需要指定流对象类型时使用fprintf函数
fprintf函数:int fprintf(FILE *stream, const char *format, …);

#include<stdio.h>

int main(){
	fprintf(stdout,"Hello,Linux io\n"); //标准输出,等同于printf
	return 0;
}

文件缓冲

在这里插入图片描述
文件缓冲区由系统自动创建,减少了read和write系统调用的次数,缓存标准大小为8192
一般标准io缓存分为:全缓存、行缓存、不缓存

类型效果
全缓存缓存区满才进行一次IO
行缓存缓存区存储一行时进行一次IO,stdout为行缓存
不缓存直接进行IO操作,不缓存,如 stderr

缓存强制刷新

一般在程序结束时会自动刷新缓冲区,fflush()可以在程序未结束时刷新缓冲区。

#include <stdio.h>
int fflush(FILE *stream);

标准IO

fopen

FILE *fopen(const char *pathname, const char *mode);
fopen() mode :r、a、w、r+、a+、w+

fclose

int fclose(FILE *stream);

fgetc

int fgetc(FILE *stream);

fputc

int fgetc(FILE *stream);

fgets

char *fgets(char *s, int size, FILE *stream);
return:returns s on success, and NULL on error or when end of file occurs while no characters have been read.

fputs

int fputs(const char *s, FILE *stream);
return:return a nonnegative number on success, or EOF on error.

fread
fwrite
fseek

格式化输入输出

在这里插入图片描述

fprintf
  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值