Linux系统程序设计:从入门到高级Day01

news2025/4/5 2:33:53

知识点1 【系统调用】

  1. 系统调用的概述

系统调用:内核 提供给 用户 可以 操作内核 的一组函数接口

关系:用户 借助 系统调用 操作内核

进程的空间分为:内核空间 和 用户空间

用户一般都是在用户空间操作的,但是有的时候用户需要获得系统服务,此时就要借助系统调用来实现这一目的

并且 系统调用 访问内核的路径都是内核安排好的,用户只能从特定的入口进入,也只能从特定的入口出内核,目的是为了保护内核的正常运行

  1. 系统调用和库函数的区别

这里我们从他们两个的定义 和关系来说明区别

定义

系统调用:由内核提供给用户的可以操作内核的一组函数接口

库函数:由第三方提供的函数接口

关系:库函数分为两种

  1. 调用 系统调用 的函数,如strcpy strlen
  2. 没有调用 系统调用 的函数,如fwrite fclose fopen

如果 库函数 没有调用 系统函数,那么该库函数不能够操作内核

大家请看下面这个图片

我们可以从上面这张图 知道分为内核态和用户态,运行在内核态的进程可以无限制的访问各种资源,毫无疑问,我们的系统调用就是属于内核态,但是它是如何从用户态切换到内核态的呢

答案:通过软件中断,所谓软件中断就是通过软件指令出发的 并非外设(硬件)触发的中断。软件指令:编程人员开发中设置的一些 安全异常

系统调用的缺点

我们已经知道了系统调用的优点是可以提供给用户操作内核的一组函数接口,进而保护内核空间。那么缺点呢?

系统调用是需要时间的,频繁使用会降低程序的运行效率。当调用 系统调用 的时候,会进行连续的状态转换,这些状态转换会浪费许多时间

文件描述符

引入

我们都知道再Linux 中 万物皆可视为文件,那么我们该如何操作这些文件呢,这就需要 文件描述符

文件描述符的概述

Linux将 系统调用 打开或者新建的文件,用一个 非负整数 来表述。而这个 非负整数 就是 文件描述符。  对该文件的操作即是对该文件描述符的操作

系统默认打开的三个文件描述符:0,1,2

0:标准输入设备(键盘)

1:标准输出设备(终端)

2:标准输出设备(终端)

文件描述符表如何管理文件描述符

系统会为每个进程,都分配 文件描述符表,来管理该进程中的所有文件描述符

补充:文件描述符表 是在内核空间中存储的

那么,文件描述符表是如何管理文件描述符的呢?

答案:位图,也可以叫做二进制图形

我们可以将其理解为,图形化的数组,数组中存储的是一个二进制位。那么文件描述符就是数组的下标,数组中的内容就是文件的状态:1为打开状态,0为关闭状态。

并且 系统默认的位图最多可以存储 1024个二进制位。

下面我们总结一下

系统默认位图最大容量为1024个二进制位,位图的位数代表文件描述符,位上的内容代表文件的状态(1为打开,0为关闭)

大家请看我老师画的这张图:

我们该如何查看文件的文件描述符呢?

通过以上方式即可

ps -A 查看所有文件

grep 滤出 a.out 文件

此步骤可以 找到你的可执行文件的进程号

ls 即是通过进程好找到该进程的文件描述符

需要注意的是:

当打开文件的时候,默认会选择 最小可用的 文件描述符

更加深刻理解最小可用

如果你执行了

上面的操作 你有可能会出现下面这种情况:

当利用ls 执行后:

文件描述符为 1 3 2 19 20 4 5

不是说会选择最小可用吗 那为什么2会在3的后面呢?

这个问题 我遇到的时候也很疑惑,是为什么呢?

答案:在 1 2 3 后,关闭文件2,此时为1 3

如果这时打开文件,系统会为其分配最小可用的2文件描述符 这时的文件描述符 排列就为1 3 2

那为什么会忽然出现19呢

是因为4-18 正在被使用

而后面出现4 5 就和上面为什么会在3后面出现2 是一样的道理了。

相信你现在已经深刻理解了 文件描述符

总结

下面我们总结一下 今天的知识点:

  1. 系统调用的概述:
    1. 定义
    2. 与库函数的区别
  2. 系统调用的缺点
  3. 文件描述符
    1. 定义
    2. 文件描述符,文件描述符表,位图的关系
    3. 如何查询进程的文件描述符
    4. 你对最小可用的理解

结束

今天的内容就到此结束了,今天的内容大多篇概念类型,记忆内容较多,可能内容比较枯燥,但是我都加入了我的理解,已经尽可能的将抽象的内容变得形象。如果你有什么疑惑,可以评论留言,大家一起讨论。

最后,希望我的分享对你能够有所帮助,如果喜欢我的分享,请点赞收藏加关注,谢谢大家!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2327093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openEuler24.03 LTS下安装HBase集群

前提条件 安装好Hadoop完全分布式集群,可参考:openEuler24.03 LTS下安装Hadoop3完全分布式 安装好ZooKeeper集群,可参考:openEuler24.03 LTS下安装ZooKeeper集群 HBase集群规划 node2node3node4MasterBackup MasterRegionServ…

关于testng.xml无法找到类的问题

问题:testng.xml添加测试类的时候飘红 解决办法: 1.试图通过自动生成testng.xml插件去解决,感觉也不是这个问题,没有尝试; 2.以为是创建包的方式不对,重新删除后新建--还是找不到 想新建类的时候发现从m…

数据结构:探秘AVL树

本节重点 理解AVL树的概念掌握AVL树正确的插入方法利用_parent指针正确更新平衡因子掌握并理解四种旋转方式:左单旋,右单旋,左右双旋,右左双旋 一、AVL树的概念 AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&…

Linux 入门:基础开发工具(上)vim,gcc/g++,make/makefile

目录 一.软件包管理器 一).软件包 二).安装软件 三).删除软件 二.编辑器vim 一).vim的基本介绍 1.正常/普通/命令模式(Normal mode) 2.插入模式(Insert mode) 3.底行模式(last line mode) 二).vim的基本操作 …

5、无线通信基站的FPGA实现架构

基站(Base Station,BS),也称为公用移动通信基站,是无线电台站的一种形式,具体则指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间的信息传递的无线电收发信电台。…

Linux2 CD LL hostnamectl type mkdir dudo

查看主机名信息 设置静态主机名 同时配置静态、瞬时主机名 下载Vmware tools https://blog.csdn.net/qq_34638161/article/details/102779721 mkdir创建目录 问题:为什么在root目录下 看不到 /var /usr那些文件夹

Docker容器部署Java项目的自动化脚本(Shell编写)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Docker容器部署Java项目的自动化脚本&#x…

STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出

目录 前言 输出时的GPIO控制部分 标准库是如何操作寄存器完成GPIO驱动的初始化的? 问题1:如何掌握GPIO的编程细节——跟寄存器如何打交道 问题2:哪些寄存器,去哪里找呢? 问题三,寄存器的含义&#xff…

UniApp集成极光推送详细教程

最近项目要集成推送服务,选型极光推送,记录一下开发过程。 1、极光官网注册登录 1.1选择极光推送产品,新建应用 1.2在下一步中选择Android/IOS的消息推送服务 1.3产品设置中输入应用包名(一经输入后不可更改,一定要正…

AI战略群与星际之门:软银AI投资版图计划深度解析

一、星际之门:万亿美元级 AI 基础设施革命 1.1 项目背景与战略定位 在 AI 技术迅猛发展的今天,算力已成为推动其前进的核心动力。软银联合 OpenAI、甲骨文、英伟达、微软、arm推出的 “星际之门”(Stargate)计划,无疑是 AI 领域的一颗重磅炸弹。作为 AI 领域史上最大单笔…

系统思考与时间管理

时间管理的真正秘诀:主动浪费时间? 巴菲特的私人飞机驾驶员觉得自己不够成功,于是向巴菲特请教应该怎么做。巴菲特让他列出了自己人生中最想实现的25个目标,并按重要程度排序,接着安排时间专注做前五件最重要的事情。…

mac air m系列arm架构芯片安装虚拟机 UTM+debian 浏览器firefox和chrome

成果展示:debian虚拟机,你值得拥有! 预期结果 1、mac的m系列芯片,arm 架构且内存小,安装虚拟机。 考虑到mac m系列芯片8g内存,arm架构想安装一个轻量的虚拟机,偶然之间发现了debian&#xff0c…

Keepalived+LVS+nginx高可用架构

注明:所有软件已经下载好,防火墙和SELinux已经全部关闭 一.搭建NFS 1.服务端 1.创建文件 [rootnfs ~]# mkdir -p /nfs/data 2、修改权限 [rootnfs ~]# chmod orw /nfs/data 3、写配置文件 [rootnfs ~]# cat /etc/exports /nfs/data 192.168.111.118(r…

【力扣hot100题】(034)LRU缓存

做完这题已经没有任何力气写链表题了。 思路很简单,就是调试特别的痛苦。 老是频频报错,唉。 class LRUCache { public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}L…

【redis】缓存 更新策略(定期、实时生存),缓存预热、穿透、雪崩、击穿详解

什么是缓存 redis 最常用的场景 核心思路就是把一些常用的数据,放到触手可及(访问速度更快)的地方 ⽐如我需要去⾼铁站坐⾼铁. 我们知道坐⾼铁是需要反复刷⾝份证的 (进⼊⾼铁站, 检票, 上⻋,乘⻋过程中, 出站…)正常来说, 我的⾝份证是放在…

使用STM32CubeMX和Keil在STM32上创建并运行一个简单的FreeRTOS多任务程序

目标 利用FreeRTOS运行两个任务,分别为点灯和OLED屏的显示。 利用STM32CubeMX生成Keil工程和相关初始化代码 知识回顾 之前已经利用STM32CubeMX生成过Keil工程和相关初始化代码了,可以去回顾一下,详情见:https://blog.csdn.ne…

从查重报告入手的精准论文降重秘籍

每个同学在使用论文查重时,为何同一篇文章,可能重复率从10%—30%不等?归根结底还是使用了不同查重系统。其实不同的论文查重与论文AIGC检测系统的算法、数据及模型都不一样,那如何针对这些系统的“个性”精准降重,这篇…

Uubuntu20.04复现SA-ConvONet步骤

项目地址: tangjiapeng/SA-ConvONet: ICCV2021 Oral SA-ConvONet: Sign-Agnostic Optimization of Convolutional Occupancy Networks 安装步骤: 一、系统更新 检查系统是否已经更新到最新版本: sudo apt-get update sudo apt-get upgra…

【Linux网络#18】:深入理解select多路转接:传统I/O复用的基石

📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 目录 一、前言:🔥 I/O 多路转接 为什么需要I/O多路转接? 二、I/O 多路转接之 select 1. 初识 select2. select 函数原型2.1 关于 fd_set 结…

华院计算3项应用成果入选钢铁行业智能制造解决方案推荐目录(2024年)

近日,中国钢铁工业协会发布《钢铁行业智能制造解决方案推荐目录(2024年)》。由中国钢铁工业协会、钢铁行业智能制造联盟共同开展了2024年钢铁行业智能制造解决方案及数字化转型典型场景应用案例遴选、智能制造创新大赛(钢铁行业赛…