Linux系统编程(一):基本概念

news2024/12/26 20:58:59

参考引用

  • Unix和Linux操作系统有什么区别?
  • 一文带你彻底搞懂posix

Linux系统编程(文章链接汇总)

1. Unix 和 Linux

在这里插入图片描述

1.1 Unix

  • Unix 操作系统诞生于 1969 年,贝尔实验室发布了一个用 C 语言编写的名为「Unix」的操作系统,该系统可以更快地修改、调整与移植适配
    • Unix 操作系统主要在 CLI(命令行界面)上工作
    • Unix 的个人用户不多,主要使用集中在商业领域

1.2 Linux

  • 1991 年,芬兰大学生 Linus Torvalds 开发了一个自由的内核(Linux 这个名字来自于其使用的内核名称)
    • 1992 年,把 Linux 和 GNU 系统结合起来,就构成一个完整的操作系统:基于 Linux 的 GNU 系统(GNU/linux)
    • Linux 并没有使用 Unix 的源码,而是按照公开的 POSIX 标准重新编写

1.3 二者对比

  • Linux 思想源于 Unix,以 Unix 为原型开发的
  • Linux 完全开源,Unix 是版权专有
  • Linux 狭义上是指 GNU/Linux 操作系统使用的内核,广义上讲,是一种「类Unix」操作系统;Unix 狭义上是指贝尔实验室最初开发的一整套操作系统,广义上讲是属于符合「Unix」标准的一类操作系统
  • Linux 的默认 shell 是 BASH;而 Unix 用的是 Bourne shell

1.4 其他

  • Linux(不包含 GNU 组件) 是 Android(2007.11) 的内核
  • 苹果使用 UNIX 作为 iOS(2007.1) 和 macOS 的内核

2. Ubuntu 和 Linux

  • Linux 是一个开源的操作系统内核(一个 640KB文件,在 /Boot 目录下),而 Ubuntu 是基于 Linux 内核开发的一个完整的操作系统,具体而言,Ubuntu 是基于 Debian 发行版的 Linux 操作系统

3. POSIX 标准

3.1 定义

  • POSIX(Portable Operating System Interface,可移植操作系统接口
  • POSIX 是 IEEE 为了在各种 UNIX 操作系统上运行的软件而定义的一系列 API 标准的总称
  • POSIX.1 已被国际标准化组织(International Standards Organization,ISO)接受,命名:ISO/IEC 9945-1:1990

3.2 历史

  • 为了提高兼容性和应用程序的可移植性,IEEE 开始标准化 Unix 的开发,由 Richard Stallman 命名为 POSIX,这套标准涵盖了很多方面,比如 Unix 系统调用的 C 语言接口、shell 程序和工具、线程及网络编程
  • Unix 和 Linux 均遵循 POSIX 标准
  • 有了这个规范,就可以调用通用的 API,Linux 提供的 POSIX 系统调用在 Unix 上也能执行

4. 系统调用和库函数

  • Linux 下对文件操作有两种方式:系统调用(system call)和库函数(Library functions)

4.1 系统调用

  • 系统调用是 Linux 内核提供给应用层的应用编程接口(API),是 Linux 应用层进入内核的入口,内核提供了一系列服务、资源、支持等,应用程序通过系统调用 API 函数来使用内核提供的服务、资源以及各种各样的功能
  • 通过系统调用 API 函数,应用层可以实现与内核的交互,其关系可通过下图简单描述
    在这里插入图片描述

Linux 应用编程(系统编程)与裸机编程、驱动编程有什么区别?

  • 1. 裸机编程:一般把没有操作系统支持的编程环境称为裸机编程环境,如:单片机上的编程开发,编写直接在硬件上运行的程序,没有操作系统支持
  • 2. 驱动编程:狭义上 Linux 驱动编程指的是基于内核驱动框架开发驱动程序,驱动开发工程师通过调用 Linux 内核提供的接口完成设备驱动的注册,驱动程序负责底层硬件操作相关逻辑
  • 3. 应用编程:基于 Linux 操作系统的应用编程,在应用程序中通过调用系统调用 API 完成应用程序的功能和逻辑,应用程序运行于操作系统之上。通常在操作系统下有两种不同的状态:内核态和用户态,应用程序运行在用户态,而内核则运行在内核态

4.2 库函数

  • 库函数(Library function)是把函数放到库里,供别人使用的一种方式,库函数调用面向应用开发,可分为两类
    • 一类是 C 语言标准规定的库函数
    • 一类是编译器特定的库函数
  • C 语言库是应用层使用的一套函数库,在 Linux 下通常以动态库文件(.so)形式提供,存放在根文件系统 /lib/x86_64-linux-gnu 目录,命名方式通常是 libc.so.6,不过这是一个软链接文件,它会链接到真正的库文件,C 语言库函数构建于系统调用之上,也就是说大部分库函数其实是由系统调用封装而来
    • 有些库函数并不调用任何系统调用,如:字符串处理函数 strlen()、strcat()、memcpy()、memset()、strchr()等
    • 有些库函数会使用系统调用来完成实际操作,如:库函数 fopen 内部调用了系统调用 open() 来帮它打开文件、库函数 fread() 就利用了系统调用 read() 来完成读文件操作、fwrite()就利用了系统调用 write()来完成写文件操作

为什么需要库函数?

  • 有些系统调用使用起来并不是很方便,于是就出现了 C 语言库,这些 C 语言库函数的设计是为了提供比底层系统调用更为方便、更为好用、且更具有可移植性的调用接口

4.3 标准 C 语言函数库

  • 在 Linux 系统下,使用的 C 语言库为 GNU C 语言函数库(也叫 glibc),作为 Linux 下的标准 C 语言函数库。glibc 为程序员提供丰富的 API,这些 API 的函数名、返回值和参数类型等都必须按照 POSIX 标准来定义
  • 确定 Linux 系统的 glibc 版本
    $ cd /lib/x86_64-linux-gnu
    $ ls -l libc.so.6    # libc.so.6 软链接到 libc-2.27.so 库文件,2.27 便是 Linux 系统的 glibc 版本
    lrwxrwxrwx 1 root root 12 5月   3  2022 libc.so.6 -> libc-2.27.so
    

4.4 二者对比

  • 库函数属于应用层,而系统调用是内核提供给应用层的编程接口,属于系统内核的一部分
  • 库函数运行在用户空间,调用系统调用会由用户空间(用户态)陷入到内核空间(内核态)
  • 库函数通常是有缓存的,而系统调用是无缓存的,所以在性能、效率上,库函数通常要优于系统调用
    • 库函数调用属于过程调用,运行时间为用户时间,开销较小
    • 系统调用需要在用户态和内核态之间切换,运行时间为系统时间,开销较大
  • 可移植性:库函数相比于系统调用具有更好的可移植性,通常对于不同的操作系统,其内核向应用层提供的系统调用往往都是不同的,而对于 C 语言库函数来说,由于很多操作系统都实现了 C 语言库,C 语言库在不同的操作系统之间其接口定义几乎是一样的,所以库函数在不同操作系统之间相比于系统调用具有更好的可移植性

4.5 系统调用流程

  • 当应用程序调用 printf() 函数时,printf() 函数会调用 C 库中的 printf(),继而调用 C 库中的 write(),C 库最后调用内核的 write()
    • printf() 函数执行过程中,程序运行状态切换如下
    用户态–>系统调用–>内核态–>返回用户态
    

在这里插入图片描述

  • printf() 函数、glibc 库和系统调用在系统中关系图如下
    在这里插入图片描述

  • 实例

    // test.c
    #include <stdio.h>
    
    int main(int argc, char **argv) {
        printf("Hello world!");   
        return 0;
    }   
    
    $ gcc test.c -o test
    $ strace test  # 运行程序前加上 strace,可以追踪库函数调用过程
    execve("./test3", ["./test3"], 0x7fffb2493520 /* 82 vars */) = 0
    brk(NULL)                               = 0x560a8c38b000
    access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
    access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/opt/ros/melodic/lib/tls/x86_64/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/opt/ros/melodic/lib/tls/x86_64/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/opt/ros/melodic/lib/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/opt/ros/melodic/lib/tls/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/opt/ros/melodic/lib/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/opt/ros/melodic/lib/tls/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/opt/ros/melodic/lib/tls/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/opt/ros/melodic/lib/tls", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/opt/ros/melodic/lib/x86_64/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/opt/ros/melodic/lib/x86_64/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/opt/ros/melodic/lib/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/opt/ros/melodic/lib/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/opt/ros/melodic/lib/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/opt/ros/melodic/lib/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/opt/ros/melodic/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/opt/ros/melodic/lib", {st_mode=S_IFDIR|0755, st_size=16384, ...}) = 0
    openat(AT_FDCWD, "/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/tls/x86_64/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/tls/x86_64/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/tls/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/tls/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/tls/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/tls", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/x86_64/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/x86_64/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/x86_64", 0x7ffff162afb0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/yue/PX4-Autopilot/build/px4_sitl_default/build_gazebo", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
    openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=274620, ...}) = 0
    mmap(NULL, 274620, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2f5e388000
    close(3)                                = 0
    access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
    read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\35\2\0\0\0\0\0"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=2030928, ...}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2f5e386000
    mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2f5ddb2000
    mprotect(0x7f2f5df99000, 2097152, PROT_NONE) = 0
    mmap(0x7f2f5e199000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f2f5e199000
    mmap(0x7f2f5e19f000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f2f5e19f000
    close(3)                                = 0
    arch_prctl(ARCH_SET_FS, 0x7f2f5e3874c0) = 0
    mprotect(0x7f2f5e199000, 16384, PROT_READ) = 0
    mprotect(0x560a8c066000, 4096, PROT_READ) = 0
    mprotect(0x7f2f5e3cc000, 4096, PROT_READ) = 0
    munmap(0x7f2f5e388000, 274620)          = 0
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
    brk(NULL)                               = 0x560a8c38b000
    brk(0x560a8c3ac000)                     = 0x560a8c3ac000
    write(1, "Hello world!", 12Hello world!)            = 12
    exit_group(0)                           = ?
    +++ exited with 0 +++
    
  • 程序虽然只有一个printf函数,但在执行过程中前后调用了 execve、access、open、fstat、mmap、brk、write 等系统调用。其中 write 系统调用会把字符串 Hello world! 通过设备文件 1 发送到驱动,该设备节点对应终端 stdout

    $ ls /dev/std* -l
    lrwxrwxrwx 1 root root 15 12月 11 21:10 /dev/stderr -> /proc/self/fd/2
    lrwxrwxrwx 1 root root 15 12月 11 21:10 /dev/stdin -> /proc/self/fd/0
    lrwxrwxrwx 1 root root 15 12月 11 21:10 /dev/stdout -> /proc/self/fd/1
    

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

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

相关文章

鸿蒙原生应用/元服务开发-Stage模型能力接口(二)

ohos.app.ability.AbilityConstant (AbilityConstant)一、说明 AbilityConstant提供Ability相关的枚举&#xff0c;包括设置初次启动原因、上次退出原因、迁移结果、窗口类型等。本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口…

stm32学习总结:3、Proteus8+STM32CubeMX+MDK很有搞头

stm32学习总结&#xff1a;3、Proteus8STM32CubeMXMDK很有搞头 文章目录 stm32学习总结&#xff1a;3、Proteus8STM32CubeMXMDK很有搞头一、前言二、资料收集三、实际案例-点灯1、Proteus8安装2、Proteus创建stm32F013C6项目并添加外围LED电路3、STM32CubeMX配置F103C6引脚生成…

某信服 EDR 白程序DLL劫持

本文用到的白程序回复公众号20231211进行获取。 嗯… 记得去年HW的时候某信服给我装的EDR一直没卸载&#xff0c;不是不想卸载&#xff0c;是因为卸载要密码&#xff0c;所以就摆烂了。。。。 找到EDR这个目录&#xff0c;然后把目录复制到虚拟机中&#xff0c;然后一个一个e…

记录一下快速上手Springboot登录注册项目

本教程需要安装以下工具&#xff0c;如果不清楚怎么安装的可以看下我的这篇文章 链接: https://blog.csdn.net/qq_30627241/article/details/134804675 管理工具&#xff1a; maven IDE&#xff1a; IDEA 数据库&#xff1a; MySQL 测试工具&#xff1a; Postman 打开IDE…

【无线网络技术】——无线城域网(学习笔记)

&#x1f4d6; 前言&#xff1a;无线城域网&#xff08;WMAN&#xff09;是指在地域上覆盖城市及其郊区范围的分布节点之间传输信息的本地分配无线网络。能实现语音、数据、图像、多媒体、IP等多业务的接入服务。其覆盖范围的典型值为3~5km&#xff0c;点到点链路的覆盖可以高达…

大道至简?ETH研究团队提出简化版Transformer模型,综合效率明显提升

论文题目&#xff1a; Simplifying Transformer Blocks 论文链接&#xff1a;https://arxiv.org/abs/2311.01906 2023年&#xff0c;Transformer已经成为人工智能领域中最受欢迎的基础模型&#xff0c;如今火热的大型语言模型&#xff0c;多模态大模型均由不同类型的Transforme…

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列 1、队列&#xff1a;先进先出 队列是项的有序集合&#xff0c;其中&#xff0c;添加新项的一端称为队尾&#xff0c;移除项的另一端称为队首。一个元素在从队尾进入队列后&#xff0c;就会一直向队首移动&#xff0c;直到…

财务机器人(RPA)会影响会计人员从业吗?

财务机器人会对会计从业人员有影响。 不过是正面积极的影响。 它是财务人员工作的好助手好帮手。 具体展开聊聊财务RPA机器人是如何成为财务人员的好帮手。 财务机器人是在人工智能和自动化技术的基础上建立的、以软件机器人作为虚拟劳动力、依据预先设定的程序与现有用户系…

Axure的安装以及简单使用

目录 Axure简介 是什么 有什么用 Axure的优缺点 优点&#xff1a; 缺点&#xff1a; 安装 汉化 Axure的使用 工具栏 页面 ​编辑 添加子页面 ​编辑 Axure简介 是什么 Axure是一款著名的原型设计工具。它允许用户创建交互式线框图、流程图、原型和其他设计文档&…

ERROR: [BD 41-237] Bus Interface property FREQ_HZ does not match between

在自定义IP出现以上错误时可以通过双击模块clk属性 如果是灰色无法二次编辑时&#xff0c;在封装IP时&#xff0c;选择以下菜单

【笔记】硬件工程师入门基础课程

学习视频&#xff08;b站&#xff09;&#xff1a;硬件工程师入门基础元器件课程 基础元器件课程 p1 电阻1. 定义、特性及参数1.1 色环电阻 识别方法&#xff1a;1.2 伏安特性1.3 基本参数 2.电阻的功能2.1 分压2.2 限流2.3 浪涌保护 3. 如何选择电阻 p2 电容1. 电容的定义1.1电…

redis(设置密码)配置文件详细

1.设置账号密码端口 config set requirepass 123456 设置密码为123456 config get requirepass 查看账号密码 auth 123456 登入的时候输入这个确定账号密码 1. 首先连接到Redis服务器: redis-cli 2. 然后使用CONFIG SET命令设置requirepass参数并指定密码: CONFIG SET requi…

Viewport Meta 标记:让网页适应各种设备的魔法符号

在我们用手机或平板电脑浏览网页时&#xff0c;你是否曾发现有些网页能够很好地适应屏幕&#xff0c;而有些却需要左右滑动才能完整显示内容&#xff1f;这就涉及到一个神奇的东西——Viewport Meta 标记。 最近本人在研究自适应的各自实现方法&#xff0c;比如media媒体查询、…

PR快闪模板|简约时尚快节奏开场视频PR模板剪辑素材

这是一款Premiere Pro快闪模板&#xff0c;简约时尚快节奏开场视频 pr模板剪辑素材&#xff0c;用于以独创的方式创建明亮的介绍、时尚的开场白或模特展示。 Premiere Pro CC21及以上&#xff0c;即使是初学者也可以轻松使用&#xff0c;包含视频教程。 来自PR模板网&#xff1…

Go json 差异比较 json-diff(RFC6902)

Go json 差异比较 json-diff(RFC 6902) 毕业设计中过程中为了比较矢量图的差异而依据 RFC 6902 编写的一个包&#xff0c;现已开源&#xff1a; Json-diff 使用 go get -u github.com/520MianXiangDuiXiang520/json-diff序列化与反序列化 与官方 json 包的序列化和反序列化不…

微服务学习|elasticsearch:数据聚合、自动补全、数据同步

数据聚合 聚合的分类 聚合 (aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类: 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组&#xff0c;例如一周为一组&#xff0c;或者一月为一组 度量(M…

动能资讯 | 智慧汽车—城市NOA迎爆发

在特斯拉引领的 TransformerBev 架构驱动下&#xff0c;智驾算法趋近于端到端的智驾大模型&#xff0c;使得智能驾驶开始步入城市 NOA 新时代。 消费者认知增强&#xff0c;未来市场空间广阔。伴随城市 NOA 在 23-24 年的落地和普及、L3 法规在年内的落地&#xff0c;行业 0-1…

Java-异常(一)-异常的概述和常见异常的举例

&#x1f436;b站视频 124-异常处理-异常的概述与常见异常的举例_哔哩哔哩_bilibili 目录 b站视频 5.1 异常概念 5.2 Error 示例代码 5.3 Exception异常划分 ❓面试题&#xff1a;常见的异常有哪些&#xff1f;举例说明 &#x1f436;5.1 异常概念 在使用计算机语言进行…

HarmonyOS应用开发-手写板

这是一个基于HarmonyOS做的一个手写板应用&#xff0c;只需要简单的几十行代码&#xff0c;就可以实现如下手写功能以及清空画布功能。 一、先上效果图&#xff1a; 二、上代码 Entry Component struct Index {//手写路径State pathCommands: string ;build() {Column() {//…

HCIA-H12-811题目解析(10)

1、【单选题】DHCP客户端在租期到达哪个比例时第一次发送续租报文&#xff1f; 2、【单选题】在WLAN中用于标识无线网络&#xff0c; 区分不同的无线网络的是&#xff1f; 3、【单选题】我们在笔记本电脑上搜索可接入无线网络时&#xff0c;显示出来的网络名称实际是 4、【单…