unix环境高级编程——UNIX体系架构

2023-05-16

本期主题:
unix环境高级编程——UNIX体系架构


文件IO

  • 0.初始UNIX
  • 1.系统调用
  • 2.库函数
    • 2.1 C语言的运行库
  • 3.shell


0.初始UNIX

这里略过unix的历史不讲,网上有比较详细的资料。
我们可以将操作系统定义为一种软件 ,这种软件所做的事情包括控制计算机各种硬件资源,提供应用程序的运行环境,通常这种软件被称为内核(kernel)
整体的系统架构图如下所示:
在这里插入图片描述
内核的接口被称为系统调用
公用函数库构建在系统调用之上
应用程序既可以使用公用函数库,也可以是使用系统调用
shell是一个特殊的应用程序,为运行其他应用程序提供了接口

1.系统调用

/dev目录中的设备文件的用法都是相同的,它们都可以被打开、读、写和关闭。

下面是用于访问设备驱动程序的底层函数(系统调用)。

  • open:打开文件或设备
  • read:从打开的文件或设备里读数据
  • write:向文件或设备写数据
  • close:关闭文件或设备
  • ioctl:把控制信息传递给设备驱动程序。

可以直接用系统调用 open()、read()、close()来实现文件的操作,绕过glibc的fopen、fread、fclose

2.库函数

针对底层硬件的输入输出,频繁的使用系统调用效率会非常低,原因在于:

  • 操作系统需要频繁的从 用户态 切换到 内核态,减少这种开销的一个好方法是,在程序中尽量减少系统调用的次数,并且让每次系统调用完成尽可能多的工作。
  • 硬件本身的特性决定,例如,磁带机通常一次能写的数据块长度是10k。所以,如果你试图写的数据量不是10k的整数倍,磁带机还是会以10k为单位卷绕磁带,从而在磁带上留下了空隙。

需要运行库的原因除了刚刚讲的效率低问题,还有一个就是有了标准库,会更方便上层的开发:

  • 使用简便。运行库本身就是语言级别,一般相对设计比较友好;
  • 形式统一。运行库有自身的标准,是相互兼容的,这个不会随着操作系统或者编译器的变化而变化,例如在windows上和在Linux上都是fread()函数;

因此为了给设备和磁盘文件提供更高层的接口,Linux发行版(和UNIX)提供了一系列的标准函数库
它们是一些由函数构成的集合,你可以把它们应用到自己的程序中,比如提供输出缓冲功能的标准I/O库
你可以高效地写任意长度的数据块,库函数则在数据满足数据块长度要求时安排执行底层系统调用。这就极大降低了系统调用的开销。
以下就是常用的标准I/O库函数

  • fopen、fclose
  • fread、fwrite
  • fflush
  • fseek
  • fgetc、getc、getchar
  • fputc、putc、putchar
  • fgets、gets
  • printf、fprintf和sprintf
  • scanf、fscanf和sscanf

2.1 C语言的运行库

任何一个C应用程序,背后都需要庞大的代码来进行支撑,使得该程序能够正常运行。这样的代码集合被称为 运行时库(runtime library),而C语言的运行库,被称为CRT(C运行库)。
一个C的运行库大致包含以下功能:

  • 启动和退出:包含入口函数以及入口函数所依赖的部分;
  • 标准函数:C语言标准库的函数实现;
  • I/O:I/O功能的封装和实现
  • 堆:堆的实现
  • 语言实现:语言中一些特殊功能的时间
  • 调试功能

glibc
glibc是GNU C library,是GNU旗下的C标准
glibc的发布版本主要有两部分构成

  • 一部分是头文件,例如 stdio.h/ stdlib.h等
  • 另一部分是库的二进制文件部分,libc.so以及libc.a等

3.shell

shell是一个用户可以跟操作系统交互的可视化终端,它允许用户向操作系统输入需要执行的命令,这点与Windows的命令提示符类似,但是功能更为强大。
在Linux中安装多个shell是完全可行的,用户可以挑选一种自己喜欢的shell来使用。
下图显示了shell(实际上是两种shell:bash和csh)和其他程序环绕在Linux内核的四周。
在Linux系统中,默认总是作为/bin/sh安装的标准shell是GNU工具集中的bash(GNU Bourne-Again Shell)。
在这里插入图片描述

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

unix环境高级编程——UNIX体系架构 的相关文章

随机推荐

  • Android中<xliff:g></xliff:g>的用法

    在查阅修改Android源码的过程中经常能在字符串资源中看到类似下面的标签 xff1a span class hljs tag lt span class hljs title resources span span class hljs
  • vue单文件组件的格式规范

    lt template gt lt template gt lt script gt export default name 39 39 mixins components props data return computed watch
  • Linux命令行安装weblogic12c

    Linux命令行安装weblogic12c 一 安装jdk 若已安装可跳过 1 Oracle官网下载jdk linux安装包 2 卸载linux系统中自带的jdk 使用rpm qa grep java查询出系统自带的jdk xff1b 使用
  • Ubuntu 远程免密码登录设置

    我们正常使用 ssh 远程登录服务器进行操作 xff0c 需要输入用户名 服务器ip以及密码 xff0c 当我们需要同时管理多个服务器的时候 xff0c 每次都需要重复输入这些东西会显得特别麻烦和浪费时间 xff0c 因此我们可以通过配置密
  • Mybatis resultMap启动时报错:Could not resolve type alias userResultMap Cannot find class: userResultMap

    MyBatis中在查询进行select映射的时候 xff0c 返回类型可以用resultType xff0c 也可以用resultMap xff0c resultType是直接 表示返回类型的 xff0c 而resultMap则是对外部Re
  • synchronized-锁总结

    目录 一 相关知识点 1 1 对象头 1 2 锁相关概念 1 3 查看对象头工具 二 锁流程 2 1 加锁 xff1a monitorenter 2 2 释放锁 xff1a monitorexit 一 相关知识点 在 JDK1 6 之前 x
  • 软件工程师校招面试救急包

    LeetCode牛人总结 xff08 手撕代码前看看 xff0c 抱佛脚 xff09 https github com labuladong fucking algorithm blob master README md 剑指offer x
  • 微信SDK中含有的支付功能怎么去掉?

    一 说在前面的话 这两天遇到一个特别让我DT的问题 xff0c 估计大家通过标题就能知道问题了 没错 xff0c 就是在应用中集成了微信SDK后 xff0c 它自动支持了微信分享 登录 收藏 支付等功能 这一点没啥 xff0c TM的关键点
  • Android中图片的镂空效果(不规则图形的镂空)

    一 说在前面的话 我们在做新手引导时 xff0c 经常会遇到凸显某一块功能时需求 xff0c 类似于下图 xff1a 看到这个功能点可能会有点头大 xff0c 不过好在Android为我们提供一个美好的工具 xff1a PorterDuff
  • 利用三层交换机实现VLAN间路由

    原理概述 xff1a VLAN将一个物理的LAN在逻辑上划分成多个广播域 VLAN内的主机间可以直接通信 xff0c 而VLAN间不能直接互通 在现实网络中 xff0c 经常会遇到需要跨VLAN相互访问的情况 xff0c 工程师通常会选择一
  • Failed to resolve attribute at index 6: TypedValue{t=0x2/d=0x7f0400cd a=7 r=0x7f06006e}

    今天在开发时 xff0c 遇到一个程序的Bug xff0c 记录一下 在Dialog中展示一个布局 xff0c 布局中包含了TextView报了下面的错误 xff0c 最开始还以为是颜色设置的问题 xff0c 反复核对了一下颜色设置并没有问
  • TextView的TextColor中使用selector的问题

    在TextView中如果设置选中 点击 获取焦点时 xff0c 文字颜色发生改变时 xff0c 一般我们会通过代码中设置 不过Android给我们提供了一个更简洁的方式 xff0c 就是通过selector去改变 只需要在Res目录下创建一
  • 彻底理解Java中堆和栈的区别

    1 概述 在Java中 xff0c 内存分为两部分 xff0c 一种是堆内存 xff0c 另一种就是栈内存 2 Java中变量在内存中的分配 1 类变量 static修饰的变量 xff1a 在程序加载时系统就为它在堆中开辟了内存 xff0c
  • 深入了解多线程的原理

    说在前面的话 使用多线程的目的 在多个CPU核心下 xff0c 多线程的好处是显而易见的 xff0c 不然多个CPU核心只跑一个线程其他的核心就都浪费了即便不考虑多核心 xff0c 在单核下 xff0c 多线程也是有意义的 xff0c 因为
  • An operation is not implemented: not implemented被坑之路[Kotlin]

    吐槽一下 xff0c 程序猿的辛酸史 今天在开发新项目时 xff0c 首次使用了Kotlin语言 xff0c 对于之前只在纸上谈兵 xff0c 未在项目中使用过的码农 xff0c 很是一脸懵逼 但是迫于公司的要求 xff0c 只能硬头皮冲吧
  • 开发Android Camera—使用Kotlin语言,完成第一个自定义相机

    对于首次使用Kotlin语言开发 xff0c 在网上苦于寻找不到Kotlin语言编写的相机代码 xff0c 故写下这篇博客 好了 xff0c 咱们进入主题 在Android 5 0 xff08 SDK 21 xff09 中 xff0c Go
  • Android ConstraintLayout性能分析

    这篇文件是讲述ConstraintLayout性能的分析 xff0c 如果对于使用ConstraintLayout不是很了解的情况下 xff0c 请查看Android ConstraintLayout完全解析和性能分析 xff08 章节一
  • 针对drawableStart(Top、End、Bottom)边距的设置-Android布局技巧

    作为Android程序猿 xff0c 在开发布局的过程中 xff0c 我们的宗旨是能用一个View完成的效果 xff0c 绝不会用两个View或者嵌套View来完成 至于它的好处 xff0c 就不言而喻了吧 不懂的自行到网上看 xff0c
  • markdown基本语法

    转载自 Cmd 技术渲染的沙箱页面 xff0c 点击此处编写自己的文档 Cmd Markdown 简明语法手册 标签 xff1a Cmd Markdown 1 斜体和粗体 使用 和 表示斜体和粗体 示例 xff1a 这是 斜体 xff0c
  • unix环境高级编程——UNIX体系架构

    本期主题 xff1a unix环境高级编程 UNIX体系架构 文件IO 0 初始UNIX1 系统调用2 库函数2 1 C语言的运行库 3 shell 0 初始UNIX 这里略过unix的历史不讲 xff0c 网上有比较详细的资料 我们可以将