【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第二篇 Linux系统编程篇-第三十一章 文件IO和标准IO

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT、4G模块、CAN、RS485等接口一应俱全。H264、VP8视频硬编码,H.264、H.265、VP8、VP9视频硬解码,并提供相关历程,支持8路PDM接口、5路SAI接口、2路Speaker。系统支持Android9.0(支持获取root限)Linux4.14.78+Qt5.10.1、Yocto、Ubuntu20、Debian9系统。适用于智能充电桩,物联网,工业控制,医疗,智能交通等,可用于任何通用工业和物联网应用、

【公众号】迅为电子

【粉丝群】258811263(加群获取驱动文档+例程)


第二篇 Linux系统编程篇

本章内容对应视频讲解链接(在线观看):

什么是linux系统编程  https://www.bilibili.com/video/BV1zV411e7Cy?share_source=copy_web

Linux系统编程基本程序框架   Linux系统编程基本程序框架_哔哩哔哩_bilibili

什么是Linux系统编程呢?Linux系统编程也叫Linux下的高级编程。是介于应用层和驱动层之间的。内核向用户提供的接口。本章讲述编写Linux系统应用层软件常用的一些技术,包括文件IO,标准IO,进程线程操作。这些运行在系统应用层的程序直接与内核和系统核心库进行交互,只能在Linux上运行,不能跨平台,也就是不能运行在其他操作系统上(比如windows)。Linux根据UNIX发展而来,属于类UNIX操作系统,拥有UNIX特点,但是Linux作为开源软件更专注实用功能,支持更多的系统调用,从而拥有更多的新特性。

学习系统编程可以使用man手册查看API,查找用到的头文件,如“man 2 open”,使用“top”等命令查看进程状态。本文档主要通过实验例程来说明各系统调用API和各种机制的用法。

在开始系统编程前首先要搭建环境,大家可以参考本手册第二十四章安装 Samba,首先我们来了解下Linux系统编程的基本程序框架。Samba搭建好之后,我们在samba文件夹下新建linux文件夹,如下图所示:

首先来编写下Linux系统编程的基本程序框架,在linux文件夹下新建01文件夹,01文件夹里面新建test.c文件,内容如下所示。代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\01”目录下。

#include <stdio.h>

#include <stdlib.h>

int main(int argc,char *argv[])

{

    //argc:表示的是命令行中参数的个数。 

    //argv:表示的是命令行中的参数

    int i;

    printf("argc is %d\n",argc);

    for(i=0;i<argc;i++){

        printf("argv[%d] is %s\n",i,argv[i]);

    };

    return 0;

}

我们在Ubuntu的Samba目录下输入以下编译test.c,如下图所示编译生成了a.out。 

gcc test.c

ls

此时main()函数是没有参数的,但是我们在学习Linux系统编程的时候,大多数main函数都是带参数的,因为我们要配合命令行来给我们的程序传参数。大部分情况下,main函数的参数为int argc,char *argv[]。argc表示的命令行中参数的个数。argv表示的是命令行中的参数。

第三十一章 文件IO和标准IO

本章内容对应视频讲解链接(在线观看):

标准IO和文件IO  https://www.bilibili.com/video/BV1zV411e7Cy?p=3

文件 IO是Linux系统提供的接口,针对文件和磁盘进行操作,不带缓存机制;标准IO是C语言函数库里的标准I/O模型在stdio.h中定义,通过缓冲区操作文件,带缓存机制。Linux系统中一切皆文件,包括普通文件,目录,设备文件(不包含网络设备),管道,fifio队列,socket套接字等,在终端输入“ls -l”可查看文件类型和权限。

标准IO和文件IO常用API如下:

标准IO

文件IO

打开/创建

fopen

open

getc,fgetc,getchar,fgets,gets,

fread

read

putc,fputc,putc,fputs,puts,

fwrite

write

关闭

fclose

close

标准IO和文件IO的区别如下图所示:

文件IO是直接调用内核提供的系统调用函数,头文件是unistd.h,标准IO是间接调用系统调用函数,头文件是stdio.h,文件IO是依赖于Linux操作系统的,标准IO是不依赖操作系统的,所以在任何的操作系统下,使用标准IO,也就是C库函数操作文件的方法都是相同的。

对于文件IO来说,一切都是围绕文件操作符来进行的。在Linux系统中,所有打开的文件都有一个对应的文件描述符。文件描述符的本质是一个非负整数,当我们打开一个文件时,系统会给我们分配一个文件描述符。当我们对一个文件做读写操作的时候,我们使用open函数返回的这个文件描述符会标识该文件,并将其作为参数传递给read或者write函数。在posix.1应用程序里面,文件描述符0,1,2分别对应着标准输入,标准输出,标准错误。

31.1 文件IO open()

本章内容对应视频讲解链接(在线观看):

文件I0之open函数  https://www.bilibili.com/video/BV1zV411e7Cy?p=4

函数

int open(const char *pathname, int flags)

int open(const char *pathname, int flags, mode_t mode)

头文件

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

参数pathname

路径和文件名

参数flags

文件打开方式,可用多个标志位按位或设置

参数mode

权限掩码,对不同用户和组设置可执行,读,写权限,使用八进制数表示,此参数可不写

返回值

open()执行成功会返回int型文件描述符,出错时返回-1。

作用

通过系统调用,可以打开文件,并返回文件描述符

参数flags可选标志:

O_CREAT 要打开的文件名不存在时自动创建改文件。

O_EXCL 要和O_CREAT一起使用才能生效,如果文件存在则open()调用失败。

O_RDONLY 只读模式打开文件。

O_WRONLY 只写模式打开文件。

O_RDWR 可读可写模式打开文件。

O_APPEND 以追加模式打开文件。

O_NONBLOCK 以非阻塞模式打开。

 

实验代码

编写程序,在同一目录下创建并打开一个可读可写文件a.c。代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\02”目录下。

#include <stdio.h>

#include <stdlib.h>       

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int main(int argc,char *argv[])

{

    int fd;

    fd=open("a.c",O_CREAT|O_RDWR,0666);

    if(fd<0)

    {

          printf("open is error\n");

    }

    printf("fd is %d\n",fd);

    return 0;

}

 

编译运行:

在Ubuntu上编译open.c,并运行a.out,如下图所示:

在程序中打开的文件描述符为3,这是因为在一个进程中至少包含三个文件描述符,即0表示标准输入stdin,1表示标准输出stdout,2表示标准错误stderr。

交叉编译open.c,通过NFS将编译好的文件拷贝到iTOP-iMX8MM开发板,如下图所示:

31.2 文件IO close()

本章内容对应视频讲解链接(在线观看):

文件I0之close函数→https://www.bilibili.com/video/BV1zV411e7Cy?p=5

函数

int close(int fd)

头文件

#include <unistd.h>

参数fd

文件描述符

返回值

成功返回0;错误返回-1

实验代码

编写程序,在同一目录下打开并创建一个可读可写文件,获取完属性后关闭。代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\03”目录下。

#include <stdio.h>

#include <stdlib.h>       

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

int main(int argc,char *argv[])

{

    int fd;

    fd=open("a.c",O_CREAT|O_RDWR,0666);

    if(fd<0)

    {

          printf("open is error\n");

    }

    printf("fd is %d\n",fd);

    close(fd);

    return 0;

}

编译运行:

在Ubuntu上编译open.c,如下图所示:

 

31.3 文件IO read()

本章内容对应视频讲解链接(在线观看):

文件I0之read函数  https://www.bilibili.com/video/BV1zV411e7Cy?p=6

函数

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

头文件

#include <unistd.h>

参数fd

要读的文件描述符

参数buf

缓冲区,存放读到的内容

参数count

每次读取的字节数

返回值

返回值大于0,表示读取到的字节数;

等于0在阻塞模式下表示到达文件末尾或没有数据可读(EOF),并调用阻塞;

等于-1表示出错,在非阻塞模式下表示没有数据可读。

实验代码

在程序中打开a.c文件,并读取打印文件内容。代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\04”目录下。 

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

int main(int argcchar *argv[])

{

    int fd;

    char buf[32] = {0};

    ssize_t ret;

    fd = open("a.c", O_CREAT | O_RDWR, 0666);

    if (fd < 0)

    {

        printf("open is error\n");

        return -1;

    }

    printf("fd is %d\n"fd);

    ret = read(fdbuf32);

    if (ret < 0)

    {

        printf("read is error\n");

        return -2;

    }

    printf("buf is %s\n"buf);

    printf("ret is %ld\n"ret);

    close(fd);

    return 0;

}

编译运行:

在Ubuntu上编译open.c,运行a.out,如下图所示:

 

编辑a.c文件,内容如下图所示:

运行a.out,如下图所示,成功读取到a.c文件中的hello world!

31.4 文件IO write()

本章内容对应视频讲解链接(在线观看):

文件I0之write函数  https://www.bilibili.com/video/BV1zV411e7Cy?p=7

函数

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

头文件

#include <unistd.h>

参数fd

文件描述符;

参数buf

缓存区,存放将要写入的数据

参数count

每次写入的个数

功能

每次从buf缓存区拿count个字节写入fd文件。

返回值

大于或等于0表示执行成功,返回写入的字节数;

返回-1代表出错。

实验代码

在程序中使用write函数向标准输出(屏幕)打印hello。代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\05”目录下。

#include <stdio.h>

#include <stdlib.h>       

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

int main(int argc,char *argv[])

{

    int fd;

    char buf[32]={0};

    ssize_t ret;

    fd=open("a.c",O_CREAT|O_RDWR,0666);

    if(fd<0)

    {

          printf("open is error\n");

          return -1;

    }

    write(1,"hello\n",6);

    close(fd);

    return 0;

}

编译程序并运行a.out ,如下图所示,向标准输出(屏幕)写入hello。 

实验代码

在程序中使用write函数向文件写入hello。代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\05”目录下。

#include <stdio.h>

#include <stdlib.h>       

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

int main(int argc,char *argv[])

{

    int fd;

    char buf[32]={0};

    ssize_t ret;

    fd=open("a.c",O_CREAT|O_RDWR,0666);

    if(fd<0)

    {

          printf("open is error\n");

          return -1;

    }

    write(fd,"hello\n",6);

    close(fd);

    return 0;

}

运行测试

编译运行打开a.out,并且查看写入的文件a.c,如下图所示,a.c文件成功写入hello。

 

31.5 综合练习(一)

本章内容对应视频讲解链接(在线观看):

综合练习()  https://www.bilibili.com/video/BV1zV411e7Cy?p=8

实验要求

在程序中通过命令行操作,把a.c文件里面的内容写到b.c

实验代码

代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\06”目录下。

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

int main(int argcchar *argv[])

{

    //步骤一:判断命令行的参数

    if(argc != 3)

    {

        printf("Usage:%s <src file> <obj file>\n"argv[0]);

    }

    // 步骤二:定义变量

    int fd_src;

    int fd_obj;

    char buf[32] = {0};

    ssize_t ret;

    // 步骤三:打开文件获得文件描述符

    fd_src = open(argv[1], O_RDWR);

    if (fd_src < 0)

    {

        printf("open is error\n");

        return -1;

    }

    fd_obj = open(argv[2], O_CREAT | O_RDWR, 0666);

    if (fd_obj < 0)

    {

        printf("open is error\n");

        return -2;

    }

    // 步骤四:读写操作

    while((ret=read(fd_src,buf,32))!=0)

    {

        write(fd_obj,buf,ret);

    }

    // 步骤五:关闭文件描述符

    close(fd_src);

    close(fd_obj);

    return 0;

}

编译测试

在Ubuntu上编译open.c,首先查看a.c的内容,然后运行程序,再查看b.c的内容,如下图所示,成功将a.c文件的内容拷贝到b.c文件。

 

31.6 文件IO lseek()

本章内容对应视频讲解链接(在线观看):

文件IO之Iseek函数  https://www.bilibili.com/video/BV1zV411e7Cy?p=9

所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了O_APPEND 。 使用 lseek 函数可以改变文件的 cfo 。

函数定义

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

头文件

#include <sys/types.h>

#include <unistd.h>

参数fd

文件描述符

参数off_t offset

偏移量,单位是字节的数量,可以正负,如果是负值表示向前移动;如果是正值,表示向后移动。

参数whence

当前位置的基点,可以使用以下三组值。

SEEK_SET:相对于文件开头

SEEK_CUR:相对于当前的文件读写指针位置

SEEK_END:相对于文件末尾

功能

移动文件读写指针;获取文件长度;拓展文件空间。

返回值

成功返回当前位移,失败返回-1

举个例子

  1. 把文件位置指针设置为100  lseek(fd,100,SEEK_SET);
  2. 把文件位置设置成文件末尾  lseek(fd,0,SEEK_END);
  3. 确定当前的文件位置  lseek(fd,0,SEEK_CUR);

实验代码

在程序中使用lseek函数移动文件读写位置,代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\07”目录下。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char *argv[])
{int fd;char buf[32] = {0};ssize_t ret;fd = open("a.c", O_CREAT | O_RDWR, 0666);if (fd < 0){printf("open is error\n");return -1;}// printf("fd is %d\n", fd);ret = read(fd, buf, 32);if (ret < 0){printf("read is error\n");return -2;}printf("buf is %s\n", buf);printf("ret is %ld\n", ret);lseek(fd,0,SEEK_SET);ret = read(fd, buf, 32);printf("ret is %ld\n", ret);close(fd);return 0;
}

运行测试

编译运行打开a.out ,a.c里面有hello world!,当使用lseek函数移动读写位置时,再次读a.c文件的内容,依旧可以读到a.c的内容,如下图所示:

实验代码

在程序中读a.c文件的2字节,使用lseek函数确定文件的当前位置。代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\07”目录下。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char *argv[])
{int fd;char buf[32] = {0};ssize_t ret;fd = open("a.c", O_CREAT | O_RDWR, 0666);if (fd < 0){printf("open is error\n");return -1;}// printf("fd is %d\n", fd);ret = read(fd, buf, 2);if (ret < 0){printf("read is error\n");return -2;}printf("buf is %s\n", buf);printf("ret is %ld\n", ret);ret=lseek(fd,0,SEEK_CUR);// ret = read(fd, buf, 32);printf("ret is %ld\n", ret);close(fd);return 0;
}

运行测试

编译运行打开a.out ,a.c里面有hello world!运行结果如下图所示:

实验代码

在程序中读a.c文件,使用lseek函数确定文件的长度。代码在配套资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\1.系统编程例程\系统编程配套程序\linux\07”目录下。

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

int main(int argcchar *argv[])

{

    int fd;

    char buf[32] = {0};

    ssize_t ret;

    fd = open("a.c", O_CREAT | O_RDWR, 0666);

    if (fd < 0)

    {

        printf("open is error\n");

        return -1;

    }

   // printf("fd is %d\n", fd);

    ret = read(fdbuf2);

    if (ret < 0)

    {

        printf("read is error\n");

        return -2;

    }

    printf("buf is %s\n"buf);

    printf("ret is %ld\n"ret);

    ret=lseek(fd,0,SEEK_END);

   // ret = read(fd, buf, 32);

    printf("ret is %ld\n"ret);

    close(fd);

    return 0;

}

运行测试

编译运行打开a.out ,a.c里面有hello world!运行结果如下图所示:

 

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

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

相关文章

MySQL_基础知识

目录 一、数据库 二、数据库操作 2.1 显示当前数据库 2.2 创建数据库 2.3 删除数据库 2.4 使用数据库 三、数据类型 3.1 数值类型 3.2 字符串类型 3.3 日期类型 四、表的操作 4.1 创建表 4.2 显示当前库中的表 4.3 查看表结构 4.4 删除表 总结 一、数据库 数据…

AV1技术学习: Compound Prediction

一、双向 Compound Prediction AV1支持两个参考帧的预测通过多种复合模式线性组合。复合预测公式为 其中&#xff0c;权重m(x, y) is scaled by 64 以进行整数计算&#xff0c;R1(x, y)和R2(x, y)表示两个参考块中位于(x, y)的像素。P(x, y)将按比例缩小 1/64 以形成最终的预测…

【PPT笔记】1-3节 | 默认设置/快捷键/合并形状

文章目录 说明笔记1 默认设置1.1 OFFICE版本选择1.1.1 Office某某数字专属系列1.1.2 Office3651.1.3 产品信息怎么看 1.2 默认设置1.2.1 暗夜模式1.2.2 无限撤回1.2.3 自动保存&#xff08;Office2013版本及以上&#xff09;1.2.4 图片压缩1.2.5 字体嵌入1.2.6 多格式导出1.2.7…

代码随想录算法训练营Day26 | 491.递增子序列 | 46.全排列 | 47.全排列 II | 332.重新安排行程 | 51.N皇后 | 37.解数独

今日任务 491.递增子序列 题目链接&#xff1a; https://leetcode.cn/problems/non-decreasing-subsequences/description/题目描述&#xff1a; Code class Solution { public:vector<vector<int>> findSubsequences(vector<int>& nums) {vector&l…

关于Linux的面试题(实时更新中~)

一、软连接和硬连接的区别&#xff1a; 软连接创建方式 ln -s 被链接文件 链接文件 &#xff08;1&#xff09;软链接是一个链接文件&#xff1b; &#xff08;2&#xff09;软链接有着自己的 inode 号&#xff08;文件编号&#xff09;&#xff1b; &#xff08;3&#…

Linux入门攻坚——28、php、mysql基础

httpdphp&#xff1a;是在httpd中启用模块&#xff0c;不同的工作模式&#xff0c;使用的模块不同 modules httpd&#xff1a;prefork --> libphp5.so httpd&#xff1a;event or worker --> libphp5-zts.so php&#xff1a;引入zend engine后&#xff0c;分为…

复现GMM文章(五):图5代码和数据

介绍 复现GMM文章的的Fig5图。 加载R包 library(tidyr) library(tidyverse) library(dplyr) library(ggsci) library(ggpubr) library(psych) library(ggcorrplot) library(showtext) library(ggrepel)导入数据 所有的数据可以通过下列链接下载&#xff1a; 百度网盘链接…

Unity | Shader基础知识(第十八集:Stencil应用-透视立方盒子)

目录 一、前言 二、场景布置 三、 shader部分 1.图片的部分 2.图片部分纯净代码 3.遮罩部分复习 4.深度写入 ZWrite 5.颜色遮罩ColorMask 6.遮罩纯净代码 四、场景中shader使用 五、作者的碎碎念 一、前言 因为这个内容稍微有点多&#xff0c;我尽力讲清楚了&#x…

mac拆分pdf mac如何拆分pdf成多个文件

在数字化办公日益普及的今天&#xff0c;pdf文件因其良好的兼容性和便捷性&#xff0c;已经成为工作和学习中的重要文件格式。然而&#xff0c;有时候我们可能会遇到需要将一个大的pdf文件拆分成多个小文件的情况&#xff0c;以便于管一理和分享。本文将为您详细介绍两种简单易…

MySQL 和 PostgreSQL,我到底选择哪个?

MySQL 和 PostgreSQL 是两个广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;。它们都具有强大的功能和广泛的社区支持&#xff0c;但在某些方面存在一些差异。本文将详细比较 MySQL 和 PostgreSQL&#xff0c;包括它们的特点、性能、扩展性、安全性以及适用场景等…

文献阅读:tidyomics 生态系统:增强组学数据分析

文献介绍 文献题目&#xff1a; The tidyomics ecosystem: enhancing omic data analyses 研究团队&#xff1a; Stefano Mangiola&#xff08;澳大利亚沃尔特和伊丽莎霍尔医学研究所&#xff09;、Michael I. Love&#xff08;美国北卡罗来纳大学教堂山分校&#xff09;、Ant…

virtualbox的ubuntu默认ipv4地址为10.0.2.15的修改以及xshell和xftp的连接

virtualbox安装Ubuntu后&#xff0c;默认的地址为10.0.2.15 我们查看virtualbox的设置发现是NAT 学过计算机网络的应该了解NAT技术&#xff0c;为了安全以及缓解ip使用&#xff0c;我们留了部分私有ip地址。 私有IP地址网段如下&#xff1a; A类&#xff1a;1个A类网段&…

hexo搭建博客(github node git )(失败版本)

HexoGitHub搭建个人博客教程&#xff08;2023最新版&#xff09; 搭建失败了 是因为git命令一直报错 打算明天把git和node版本全部重新安装后再弄 同时回顾一下github git 和 node的基础知识 Github新手之路&#xff08;全过程&#xff09;&#xff08;站在前辈的肩膀上的总…

Template_C++

C模板 C提供了function template. function template&#xff1a;实际上是建立一个通用函数&#xff0c;其函数类型和形参类型不具体制定&#xff0c;用一个虚拟的类型来代表。这个通用的函数就称为函数模版。 是不是可以这样理解&#xff0c;函数模版就是给了一种功能&…

pytorch学习(四)绘制loss和correct曲线

这一次学习的时候静态绘制loss和correct曲线&#xff0c;也就是在模型训练完成后&#xff0c;对统计的数据进行绘制。 以minist数据训练为例子 import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvisi…

【zabbix6监控java-tomcat全流程】

目录 一、监控主机安装zabbix-server1、zabbix的安装2、配置数据库3、为zabbix server配置数据库4、启动服务,web界面安装 二、被监控主机安装tomcat1、安装JDK2、安装tomcat 三、zabbix的服务端安装zabbix-java-gateway四、被监控主机tomcat的配置五、web界面添加主机 一、监控…

使用 Web APi - MediaRecorder 获取麦克风资源,报错:Cannot find name ‘MediaRecorder‘ 的解决方法

目录 一、背景&#xff1a; 二、具体解决方法 一、背景&#xff1a; angular 调用 MediaRecorder 来使用麦克风获取声音&#xff0c;&#xff08;具体要求&#xff1a;angular 前端 按键调用 麦克风&#xff0c;松开按键生成音频文件&#xff09;代码如下&#xff08;来自通…

【树莓派3B+】控制引脚输出高低电平

前言一、安装RPI.GPIO库二、编写简单的输出高低电平的程序三、运行程序总结 前言 首先检查一下自己的板子有没有带库 我这个是有的。 ok&#xff0c;正式进入步骤 一、安装RPI.GPIO库 如果还没有安装RPi.GPIO库&#xff0c;可以通过以下命令在树莓派上安装&#xff1a; p…

Ubuntu20.04从零开搭PX4MavrosGazebo环境并测试

仅仅是个人搭建记录 参考链接&#xff1a; https://zhuanlan.zhihu.com/p/686439920 仿真平台基础配置&#xff08;对应PX4 1.13版&#xff09; 语雀 mkdir -p ~/tzb/catkin_ws/src mkdir -p ~/tzb/catkin_ws/scripts cd catkin_ws && catkin init catkin build cd…

数据结构day2

一、思维导图 内存分配 二、课后习题 分文件编译 //sys.h #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct Stu {char name[20]; //姓名int age; //年龄double score; //分数 }stu;//定义班级类型 typedef struct Class {struct …