【Linux学习笔记(八)】之系统API与库函数的关系以及open,close,read,write函数介绍

2023-05-16

本文章由公号【开发小鸽】发布!欢迎关注!!!


老规矩–妹妹镇楼:

一. 系统api与库函数的关系

(一)调用库函数的流程

       当我们使用一些库函数,如printf(“hello world”)时,调用了文件指针 FILE *stdout, 该文件指针的组成为:

fd	文件描述符
f_pos 位置
buffer 8k的缓冲区

       如,调用printf(“hello\n”)后,系统会调用write(1, “hello\n”, 6),接着进入内核调用sys_write(“hello\n”),再通过设备驱动显示在显示器中。

(二)内核中的管理

       内核中有虚拟文件系统,内存管理,进程管理,设备管理,PCB进程控制块,文件描述符表。

       文件描述符表中存的就是文件指针中的文件描述符,如描述符0对应的是FILE * stdin,1对应的是 FILE *stdout,2对应的是 FILE * stderr,因此,上面调用printf(“hello\n”),系统会自动调用write(1, “hello\n”, 6)中的1指的就是FILE *stdout,写到标准输出上。


二. 文件IO

(一) open函数

       通过查看man文档的第二页来了解open函数:man 2 open。该函数用来打开文件。

1. 函数原型

int open(const char *pathname, int flags);
int open(const char *pathname, int flags);

2. 函数参数

(1)pathname

       文件名

(2)flags:

必选项:

	O_RDONLY:只读
 O_WRONLY:只写
 O_RDWR:读写

可选项:

O_APPEND:追加
O_CREATE ; 创建文件
O_NONBLOCK:非阻塞

3. 函数的返回值

       成功时返回最小的可用文件描述符,失败时返回-1.设置errno。

(二) close函数

1. 用途

       关闭一个文件描述符

2. 函数原型

int close(int fd);

3. 函数返回值

       成功时返回0,错误时返回-1、设置errno。

(三) read

       读取文件


1. 函数原型

size_t read(int fd, void* buf, size_t count);

2. 函数参数

fd : 文件描述符
buf: 缓冲区
count :缓冲区大小

3. 函数返回值

       成功时返回读到的大小

       失败时返回-1,并设置errno

       返回0表示读到了文件末尾

(四) write

       向文件中写入。

1. 函数原型

size_t write(int fd, const void* buf, size_t count);

2. 函数参数

fd: 文件描述符
buf: 缓冲区
count: 缓冲区大小

3. 函数返回值

       成功时返回写入的字节数

       失败时返回-1,并设置errno

       返回0代表未写入

(五) lseek

       移动文件的读写位置。

1. 函数原型

off_t lseek(int fd, off_t offset, int whence);

2. 函数参数

fd: 文件描述符
offset: 偏移量
whence: 
		SEEK_SET: 文件开始位置
		SEEK_CUR: 当前位置
		SEEK_END: 文件的结尾

3. 函数返回值

       成功时返回当前位置到开始的长度

       失败时返回-1.并设置errno

4. 函数的作用

       移动文件读写位置

       计算文件大小

5. lseek实现计算文件大小

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h
#include<fcntl.h>

int main(int argc, char *argv[]){
		if(argc != 2){
			printf(./a.out filename\n”);
			return -1;
		}

		int fd = open(argv[1], 0_RDONLY);
		int ret = lseek(fd, 0, SEEK_END);
		printf(“file size is %d\n”, ret);

		close(fd);
		return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux学习笔记(八)】之系统API与库函数的关系以及open,close,read,write函数介绍 的相关文章

  • 硬件在环仿真(HiL)测试介绍

    一 HiL是什么 xff1f 硬件在环仿真 xff08 Hardware in the Loop xff0c 简称HIL xff09 是真 的控制器连接假 的被控对象 xff0c 以一种高效低成本的方式对控制器进行全面测试 它是一种用于复杂
  • Docker Dockerfile详解

    dockerfike快速创建自定义的Docker镜像 一 目录 1 docker典型结构 2 指令介绍 3 创建docker镜像 二 结构 DockerFile分为四部分组成 xff1a 基础镜像信 维护者信息 镜像操作指令和容器启动时执行
  • 树莓派3B+(Raspberry Pi 3 Model B+)安装Ubuntu MATE 18.04及简单配置

    树莓派3B 43 安装Ubuntu MATE 18 04及简单配置 安装Ubuntu18 04 MATE下载Ubuntu 18 04 MATE准备Raspberry Pi Imager镜像烧录工具开机启动 简单配置设置root密码更新列表配
  • OpenCV之getOptimalNewCameraMatrix

    去畸变后的图像四周会出现黑色区域 xff0c 如果畸变较大 xff0c 如鱼眼镜头 xff0c 四周黑色区域将会更大 opencv中给我们提供了一个函数getOptimalNewCameraMatrix xff0c 用于去除畸变矫正后图像四
  • 【深度学习小常识】什么是mAP?

    目录 一 mAP相关概念 1 正例与负例 2 P xff08 精确率 xff09 3 R xff08 召回率 xff09 4 ACC xff08 准确率 xff09 5 AP xff08 平均精确度 xff09 6 示例 二 mAP 1 m
  • STM32CubeMX 下载和安装 详细教程

    HAL库 STM32CubeMX开发 STM32F407 目录 STM32CubeMX安装包 Win 6 6 1 下载链接 STM32CubeMX 下载 步骤1 xff1a 点击官网链接下载 官网下载地址 xff1a https www s
  • Keil5----跳转定义和查找功能

    一 Keil5 跳转定义 跳转定义 鼠标左键点击要查找的变量 方法1 xff1a 点击鼠标右键 xff0c 功能栏中有跳转定义的选项 方法2 xff1a 按快捷键 F12 具体操作如下图所示 xff1a 跳转结果 二 Keil5 查找功能
  • 使用WIFI模块AT指令进行MQTT协议通信

    劢领系列模组 xff0c 经过1年多的演化后 xff0c 已存在多套标准的固件程序 如果用户需要使用MQTT方式进行通信 xff0c 则需要选择标准AT指令 43 MQTT的版本 此版本不仅可以支持标准AT指令的SOCKET通信 xff0c
  • ActiveMQ配置wss

    最近把前端页面由原来的http升级为了https xff0c 发现之前ActiveMQ提供的ws不能强求了 xff0c https服务下要求升级到wss 全网搜索了下 xff0c 没有找到一个靠谱的文档 一 证书准备 使用wss连接服务必须
  • stm32使用HAL库快速编写智能寻迹避障小车(附代码)

    最近学校安排了一节用stm32编写寻迹避障小车的课 xff0c 但无奈学校老师教的方法让作者觉得无法理解 xff0c 但课程答辩时间快到了 xff0c 组内小组成员又做的磕磕绊绊 xff0c 于是身为组长的我就决定尝试一下用刚学的cubem
  • [hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理

    由于项目需求 xff0c 需要使用FREERTOS搭载轻量系统 xff0c 因此写此博客给大家提供一个快速搭建RTOS系统的方法 xff0c 通过cubemx快速生成 以下内容包括 xff1a FreeRTOS 简介 程序框图所需要的元器件
  • Windows C/C++ CLion 开发环境搭建

    博文目录 文章目录 IDE CLion安装设置MinGW 插件测试 特殊配置 使用 CLion 开发 C 43 43 CUDA 应用注意不要走如下弯路 IDE CLion 安装 官网 官方全版本下载 CLion 2021 2 3 exe 或
  • git常见报错解决办法,fatal: the remote end hung up unexpectedly

    问题一 xff1a 上传GIT项目报fatal the remote end hung up unexpectedly错误 上传项目报fatal the remote end hung up unexpectedly的错误 xff0c 应该
  • AtCoder从小白到大神的进阶攻略

    摘自https www cnblogs com LHYLHY p 11572011 html 在此对作者表示感谢 AtCoder从小白到大神的进阶攻略 前言 现在全球最大的编程比赛记分网站非CodeForces和AtCoder莫属了 xff
  • 2020java面试总结

    博主背景 xff1a 92年生 xff0c 渣本毕业 xff0c java岗 xff0c 经验接近6年 xff0c base上海 本文宗旨 xff1a 本文旨在将博主最近的面试经历分享给大家 xff0c 并作些总结 xff0c 尽量为在准备
  • odroid上mavros指定版本安装

    mavros 安装 指定版本 xff1a 0 16 0 https github com mavlink mavros 以下是可能出现的错误 error1 can t find mavlinkConfig cmake solution ht
  • FreeRTOS源码解析 -> vTaskDelete()

    vTaskDelete API 函数 任务可以使用API函数vTaskDelete 删除自己或其它任务 任务被删除后就不复存在 xff0c 也不会再进入运行态 空闲任务的责任是要将分配给已删除任务的内存释放掉 因此有一点很重要 xff0c
  • 设置华为交换机使用账号密码方式进行SSH登录

    1 创建rsa本地密钥对与创建账号 Huawei rsa local key pair create The key name will be Huawei Host The range of public key size is 512
  • java中反射有什么作用?

    前言 反射blog有很多 xff0c 不再赘述 xff0c 但是反射的作用具体实现场景就会比较少 xff0c 这里举个例子 一个需求 使用参数的方式传入需要执行的类名 xff0c 然后执行相应类的同名方法 普通的实现方法 静态加载 因为需要
  • 解决:本地Kafka和Druid的Zookeeper端口冲突问题

    主要是完成本地的Kafka和Druid搭建过程中 xff0c 出现的Cannot start up because port 2181 is already in use 问题 问题原因 xff1a 使用brew安装的的Druid也是自带z

随机推荐