【嵌入式操作系统(Linux篇)】实验期末复习(1)

以下是关于嵌入式操作系统(Linux篇)的实验汇总,大概率都是会考的

特别是shell程序和文件IO的操作

嵌入式操作系统实验小结—涉及期末大题

(一)Linux操作系统的使用实验

1、认识Linux操作系统的目录结构

   请进入自己电脑Linux操作系统的目录,绘制出系统的目录结构树形图,并把第一层目录的作用与功能写出来(至少写6个目录的常用功能)。

图就自己画了哦很简单的。

eg:

/bin 存放二进制程序

/boot 存放内核和启动所需的文件

/dev 存放设备文件

/etc 存放系统配置文件

/home 用户根目录

/lib 存放库文件

2、文件与目录相关命令的使用

  1. 进入/bin目录,并查看该目录下有哪些文件:

cd  /bin

ls -l

(2)进入用户主目录,在用户主目录下,新建目录myshare:

cd  /home/xxxxxxxx     ( cd ~)

mkdir   myshare

ls  -ld  myshare/

(3)用pwd命令查看当前所在的目录

Pwd

(4)新建testfile文件

touch  testfile

ls  -l

(5)设置该文件的权限模式

chmod  755   testfile

ls  -l  testfile

(6)把该文件备份到/tmp/myshare目录下,并改名为testfile.bak。

cp  testfile   myshare/testfile.bak

ls  -l  myshare/

(7)在/root目录下为该文件创建1个符号连接(若无权限,可使用root账号操作)。

ln  -s  /tmp/testfile    /root/testfile.ln

ls  -l  /root/testfile.ln

(8)删除testfile.bak文件

    rm myshare/testfile.bak

    ls  -l  myshare  通过该命令检查是否删除成功。

3、用户与系统相关命令的使用

(1)将普通用户模式转变为超级用户

su

然后输入超级用户密码。

从超级用户切回到普通用户

su  xxxxxx

(2)通过ps命令查看进程列表

ps -ef

(-e  显示所有进程     -f全格式)

4. 压缩备份命令的使用

(1)把/tmp目录打包成tmp.tar,放到/root目录下

tar  -cf   /root/tmp.tar   /tmp/*

(2)把/tmp目录压缩打包成tmp.tar.gz,放到/root目录下:

tar  -zcvf   /root/tmp.tar.gz   /tmp/*

(3)比较tmp.tar和tmp.tar.gz的大小:ls  -l   /root/tmp.tar   /root/tmp.tar.gz

(4)解压tmp.tar.gz的内容到/tmp/myshare目录:

tar  zxvf   /root/tmp.tar.gz   -C    /tmp/myshare/

(5)把/tmp目录下每个文件压缩成.gz格式:gzip *

(6)详细列出每个.gz压缩文件的信息,不解压:gzip –l *

把每个.gz压缩文件解压,并列出详细信息:gzip –dv *

(二)Vim编辑器的使用实验

先确保系统以安装好Vim编辑器(安装方法:sudo apt-get install vim),再启动Vim进入编辑器。

Vi编辑器有基本的三种模式:命令模式、编辑模式、底行模式。学会在三种模式之间的自由切换,以及三种模式下的常用命令的使用。参考教材中命令行模式和底行模式下的常见功能键完成如下操作练习。

1、准备

Ø 在“/tmp”目录下建一个名为“ViTest”的目录。Mkdir  /tmp/ViTest

Ø 进入“ViTest”目录。cd  /tmp/ViTest

2 基本功能使用实验

   Vim编辑的基本功能是:启动编辑器--进入编辑模式--编辑文本—退出编辑模式--保存并退出编辑器。

   请在/tmp/ViTest完成如上Vi编辑器的常规流程操作实验,并写出每一个步骤的操作命令方法是什么?

实验结果:

1启动编辑器:在终端输入`vim /tmp/ViTest`,回车。这将打开Vim编辑器并创建一个名为ViTest的文件,如果文件已经存在,则会打开该文件。

2进入编辑模式:在Vim编辑器中,按`i`键进入插入模式,这时可以开始编辑文本。

(3)编辑文本:在插入模式下,可以直接输入文本进行编辑。

4退出编辑模式:完成编辑后,按`Esc`键退出插入模式,返回到命令模式。

5保存并退出编辑器:在命令模式下,输入`:wq`,然后按回车。这将保存对文件的更改并退出Vim编辑器。

3 其他功能操作实验

Ø 进入ViTest目录,将文件“/etc/profile”复制到“/ViTest”目录下。cp /etc/profile  ./

再使用chmod命令更改ViTest目录下profile文件的权限为777。

Chmod 777 profile

Ø 使用Vi 打开“Vi”目录下的profile。 vi profile(请doublecheck是否是编辑的Vi目录下的profile,一定不要编辑etc目录下的profile)

请根据课堂讲述内容检查确认当前Vi编辑器属于什么模式?再按步骤完成如下命令的使用操作。

Vi编辑器属于命令模式

  • Ø 设定行号(:set nu),指出“判断profile.d文件(if [ -d /etc/profile.d ])是否存在”判断语句的行号。
  • Ø 将光标移到该行。如:19<enter>或20G(注意G要大写)
  • Ø 复制该行内容。yy
  • Ø 将光标移到最后一行行首。G
  • Ø 粘贴复制行的内容。p
  • Ø 撤销上一步的动作。u
  • Ø 将光标移动到行尾。$或End
  • Ø 光标移到21行。21G
  • Ø 删除该行。dd
  • Ø 存盘但不退出。:w(底行模式)——注意检查底部的英文提示信息
  • Ø 将光标移到首行。1G
  • Ø 插入模式下输入“Hello,this is Vi world!”。按i 键并输入“Hello,this is Vi world!”(插
  • 入模式)
  • Ø 返回命令行模式。Esc
  • Ø 向下查找字符串“bashrc”。  /bashrc(命令行模式)
  • Ø 再向上查找字符串“etc ?etc
  • Ø 强制退出Vi,不存盘。:q!(底行模式)

(三)Shell脚本编程实验

1、Shell命令脚本编写实验:编写一个shell程序,实现:在/tmp目录下,新建一个目录,目录名称为【当前用户名+TEST】,然后再将/etc/profile文件拷贝到该目录下。

实验内容3.1实验报告

实验题目

Shell命令脚本编写实验

Shell程序源码

///***此处贴上Shell程序源代码

注意:每个Shell脚本的第一条语句请使用下面这条语句:

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

#!/bin/bash  

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

# 获取当前用户名  

USERNAME=$(whoami)  

# 构建目录名称  

DIRNAME="${USERNAME}TEST"  

# 在/tmp目录下新建目录  

mkdir /tmp/$DIRNAME  

# 检查目录是否创建成功  

if [ -d "/tmp/$DIRNAME" ]; then  

    echo "目录 /tmp/$DIRNAME 创建成功"  

    # 将/etc/profile文件拷贝到该目录下  

    cp /etc/profile  /tmp/$DIRNAME/  

    if [ $? -eq 0 ]; then  

        echo "文件 /etc/profile 已成功拷贝到 /tmp/$DIRNAME/"  

    else  

        echo "拷贝文件时出错"  

    fi   

else  

    echo "目录创建失败"  

fi

运行过程及结果截图

///***此处贴上S  hell程序运行过程及结果截图

其他情况说明

2、数值计算程序编写实验:编写一个shell程序,实现计算100以内能被3整除的数的个数和这些数的和。(提示:可用数值运算命令expr)

实验内容3.1实验报告

实验题目

数值计算程序编写实验

Shell程序源码

///***此处贴上Shell程序源代码

注意:每个Shell脚本的第一条语句请使用下面这条语句:

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

#!/bin/bash  

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

count=0  

sum=0  

for ((num=1; num<=100; num++))  

do  

  if (( num % 3 == 0))  

  then  

    count=$((count + 1))  

    sum=$((sum + num))  

  fi  

done  

echo "100以内能被3整除的数的个数为: $count"  

echo "这些数的和为: $sum

运行过程及结果截图

///***此处贴上Shell程序运行过程及结果截图

其他情况说明

  1. 函数编程实验:编写一个shell程序,先设计一个函数NumberReverse,用于实现对输入的一串数字取反序,如:输入1234,则打印4321。然后在主函数中实现循环等待用户输入一串数字,再调用当用户输入q时,程序退出。

实验内容3.1实验报告

实验题目

函数编程实验

Shell程序源码

///***此处贴上Shell程序源代码

注意:每个Shell脚本的第一条语句请使用下面这条语句:

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

#!/bin/bash  

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"  

NumberReverse() {  

    local reversed=""  

    local -n num_str=$1    

for (( i=${#num_str}-1; i>=0; i-- ))

do  

        reversed="${reversed}${num_str:$i:1}"  

    done  

    echo "$reversed"  

}  

while true; do   

    read -p "请输入一串数字(输入q退出): " input  

      if [ "$input" == "q" ]; then  

        echo "程序已退出。"  

        break  

    fi    

    reversed_number=$(NumberReverse input)  

    echo "反转后的数字是: $reversed_number"  

done

运行过程及结果截图

///***此处贴上Shell程序运行过程及结果截图

其他情况说明

GCC 编译器的使用

  参考教材中gcc的命令和编译选项,自行构造实验,测试总体选项、警告和出错选项以及优化选项的编译效果。请自由选择3个编译选项进行对比试验,并描述该编译选项的效果是什么。

  • -Wall(启动所有警告)【这个应该触发a未初始化的信息】
  • gcc -Wall  hello.c  -o hello
  • -Werror(将警告视为错误)
  • gcc -Werror  hello.c  -o hello
  • -O2(优化等级为2)
  • gcc  -O2  hello.c  -o hello

GDB 基本命令的使用

使用Vim 编辑源程序,在终端中输入vi gdbtest.c,输入如下源代码,

编辑完成后存盘。此代码的功能为输出倒序main 函数中string[]数组中定义的字符串,但结果没有输出显示,现通过gdb调试的方式来解决程序中存在的问题。程序源代码如下:

#include <stdio.h>

int display1 (char *string)

int display2 (char *string1)

int main ()

{

char string[] = "Embedded Linux";

display1 (string);

display2 (string);

}

int display1 (char *string)

{

printf ("The original string is %s \n", string);

}

int display2 (char *string1)

{

char *string2;

int size,i;

size = strlen (string1);

string2 = (char *) malloc (size + 1);

for (i = 0; i < size; i++)

string2[size - i] = string1[i];

string2[size+1] = ' ';

printf("The string afterward is %s\n",string2);

}

(1)用gcc 编译:gcc gdbtest.c -o gdbtest

编译是否会报错?如报错,请根据报错信息分析错误原因,修改编译错误,并把修改方法在此描述。修改编译通过后再进行后续实验。

(2)运行gdbtest:./ gdbtest,分析程序运行的输出结果是?

请分析程序输出结果,分析其存在的问题。

(3)启动Gdb 调试:gdb gdbtest

输入gdb命令l,查看源代码:观察是否可以正常查看到源代码?如不能请分析原因是什么并回答。使用q命令,退出gdb。

不可以看到源代码,未加上“-g”选项,这样编译出的可执行文件不会包含调试信息,GDB无法载入该可执行文件

(4)用gcc的-g选项重新编译:gcc -g gdbtest.c -o gdbtest

再次启动gdb调试:gdb gdbtest

输入gdb命令l,查看源代码:

Ø

在20 行(for 循环处)设置断点:b 20

Ø 在23 行(printf 函数处)设置断点:b 23。

Ø 查看断点设置情况:info b

Ø 运行代码:r

Ø 单步运行代码:n

Ø 查看暂停点变量值:p string2[size - i]

查看暂停点变量值:p i

Ø 继续单步运行代码数次,并使用命令查看变量的值,发现string2[size-1]的值正确

Ø 继续程序的运行:c

Ø 程序在printf 前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没

有被正确赋值,而后面的复制都是正确的,这时,定位程序第31 行,发现程序运

行结果错误的原因在于“size-1”。由于i 只能增到“size-1”,这样string2[0]就永远

不能被赋值而保持NULL,故输不出任何结果。

Ø 退出gdb:q

Ø 重新编辑gdbtest.c,把其中的“string2[size - i] = string1[i]”改为“string2[size – i - 1] =

string1[i];”即可。

使用Gcc 重新编译,查看运行结果:./ gdbtest

The original string is Embedded Linux

The string afterward is xuniL deddedbmE

这时,输入结果正确。

(六)Make 工程管理器的使用

小结过程:

vi MakeTest.c

写测试代码

vi makefile

写Makefile代码

退出vim

make

./MakeTest.c

(1)编辑源代码,利用文本编辑器vi 创建MakeTest.c 文件,vi  MakeTest.c

#include <stdio.h>

int main()

{

printf("Welcome to Test makefile!\n");

return 1;

}

(2)编写Makefile 文件。

利用文本编辑器创建一个makefile 文件,并将其保存到与MakeTest.c 相同的目录下

CC=gcc

CFLAGS=

all: MakeTest

MakeTest: MakeTest.o

        $(CC) $(CFLAGS) MakeTest.o –o MakeTest

MakeTest.o: MakeTest.c

        $(CC) $(CFLAGS) –c MakeTest.c –o MakeTest.o

clean:

        rm *.o

  1. 使用Make 编译项目。执行make,查看并记录所生成的文件,对生成可执行程序进行运行,查看运行的结果。

文件IO编程实验

(1)基本IO(非缓冲)操作编程:编写一个基本IO操作的源代码,要求使用到基本IO操作的5个函数:打开、读取、写入、定位和关闭。编译上述源代码并调试通过,最后对运行结果予以分析验证。

open、write、lseek、read、close

(2)标准IO(缓冲)操作编程:编写一个标准IO操作的源代码,要求使用到标准IO操作的5个函数:打开、读取、写入、定位和关闭。编译上述源代码并调试通过,最后对运行结果予以分析验证。

fopen、fwrite、fseek、fread、fclose

注:文件IO编程操作实验中,要实现的具体功能自拟(只要应用到了5个函数即可),提交源代码和对应的运行结果。

补充:(期末大题)

(1)基本IO操作的综合示例:

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


int main(void)
{ int fd, size;
char s[] ="This program is used to show how to use open(), write(), read() function.\nHave fun!\n”;

char buffer[80];
/*以可读写的方式打开一个文件,如果不存在则创建该文件*/
fd = open("temp.log",O_WRONLY|O_CREAT );

if(-1 ==fd)

{printf("Open or create file named \"temp.log\" failed.\n");
return -1;}
write( fd, s, sizeof(s) );/*向该文件中写入一个字符串*/

close( fd );
fd =open("temp.log", O_RDONLY);
if (-1 == fd )
(printf("Open file named \"temp.log\"failed.\n”))return -1;}
/*读取文件内容保存到buffer指定的字符串数组中,返回读取的字符个数
size = read( fd, buffer, sizeof(buffer) );
close( fd );
printf( "%s", buffer );
return 0;
 

(2)标准IO操作的综合示例:

/****readrec.c***/
#include <stdio.h>
#include <stdlib.h>
struct record {
char name[10];
int age;

};
int main(void)
(
struct record array[2];
FILE *fp = fopen("recfile", "r"); if (fp ==NULL){
perror("Open file recfile”);exit(1);
}

fread(array, sizeof(struct record), 2, fp);
printf("Name1: %s\tAge1: %d\n", array[0].name, array[0].age);

printf("Name2: %s\tAge2: %d\n", array[1].name, array[1].age);

fclose(fp);
return 0;
)

/****writerec.c***/
#include <stdio.h>
#include <stdlib.h>
struct record {char name[10];int age;};
int main(void){
struct record array[2] = {{"Ken", 24), ("Knuth", 28});
FILE *fp = fopen("recfile", "w"); if (fp ==NULL)(
perror("Open file recfile");
exit(1);
fwrite(array, sizeof(struct record), 2, fp); fclose(fp);
return 0;

}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个开源的、独立的、可自托管的评论系统,专为现代Web平台设计

大家好&#xff0c;今天给大家分享的是一个开源的、独立的、可自托管的评论系统&#xff0c;专为现代Web平台设计。 Remark42是一个自托管的、轻量级的、简单的&#xff08;但功能强大的&#xff09;评论引擎&#xff0c;它不会监视用户。它可以嵌入到博客、文章或任何其他读者…

如何知道docker谁占用的显卡的显存?

文章目录 python环境安装nvidia-htop查看pid加一个追踪总结一下【找到容器创建时间】使用说明示例 再总结一下【用PID找到容器创建时间&#xff0c;从而找到谁创建的】使用说明示例 python环境安装nvidia-htop nvidia-htop是一个看详细的工具。 pip3 install nvidia-htop查看…

Qt:4.信号和槽

目录 1.信号源、信号和槽&#xff1a; 2.Qt类的继承关系&#xff1a; 3.自定义槽函数&#xff1a; 4.第一种信号和槽的连接的方法&#xff1a; 5.第二种信号和槽的连接的方法&#xff1a; 6.自定义信号&#xff1a; 7.发射信号&#xff1a; 8.信号和槽的传参&#xff1a;…

第7章_低成本 Modbus 传感器的实现

文章目录 第7章 低成本 Modbus 传感器的实现7.1 硬件资源介绍与接线7.2 开发环境搭建7.3 创建与体验第 1 个工程7.3.1 创建工程7.3.2 配置调试器7.3.3 配置 GPIO 操作 LED 7.4 UART 编程7.4.1 使用 STM32CubeMX 进行配置1.UART12.配置 RS485方向引脚 7.4.2 封装 UART7.4.3 上机…

已解决javax.security.auth.login.LoginException:登录失败的正确解决方法,亲测有效!!!

已解决javax.security.auth.login.LoginException&#xff1a;登录失败的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查用户名和密码 用户名和密码验证 2. 验证配置文件 …

前端面试题(基础篇十二)

一、link标签定义、与import的区别 link 标签定义文档与外部资源的关系。 link 元素是空元素&#xff0c;它仅包含属性。 此元素只能存在于 head 部分&#xff0c;不过它可出现任意数。 link 标签中的 rel 属性定义了当前文档与被链接文档之间的关系。常见的 stylesheet 指的是…

ServletConfig与ServletContext详解

文章目录 概要web.xmlServletConfig介绍ServletConfig实例ServletConfig细节ServletContext介绍ServletContext实例ServletContext细节ServletContext获得服务访问次数&#xff08;可拓展&#xff09;总结 概要 web.xml <?xml version"1.0" encoding"UTF-…

使用uniapp编写微信小程序

使用uniapp编写微信小程序 文章目录 使用uniapp编写微信小程序前言一、项目搭建1.1 创建项目方式1.1.1 HBuilderX工具创建1.1.2 命令行下载1.1.3 直接Gitee下载 1.2 项目文件解构1.2.1 安装依赖1.2.2 项目启动1.2.3 文件结构释义 1.2 引入uni-ui介绍 二、拓展2.1 uni-app使用uc…

谷粒商城实战(045集群学习-elasticsearch(ES)集群)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第368p-第p369的内容 文章目录 简介集群健康分片新增节点水平扩容问题和解决集群结构测试集群信息 简介 不管用户发给哪个节点&#xff0c;都可以…

Adobe Acrobat Pro或者Adobe Acrobat Reader取消多标签页显示,设置打开一个pdf文件对应一个窗口。

Windows系统&#xff1a;Adobe Acrobat Pro或者Adobe Acrobat Reader首选项-一般-取消在同一窗口的新标签中打开文档&#xff08;需要重启&#xff09;的对勾&#xff0c;点击确定&#xff0c;彻底关闭后重启&#xff0c;这样打开的每一个PDF文件对应的是一个窗口&#xff0c;并…

vue3+ el-upload封装上传组件

组件功能介绍 上传格式限制上传大小限制上传文件数量限制自定义上传区上传成功回调禁用上传开关与点击上传自定义事件暴露所以上传文件列表&#xff08;uploadList&#xff09;与当前文件数据&#xff08;uploadLatestFile&#xff09; 组件代码Upload.vue <template>&l…

玩具租赁系统(安装+讲解+源码)

技术栈: 后端: SpringBoot Mysql MybatisPlus 前端: Vue Element 分为 管理员端 用户端 功能: 用户端 管理员端 观看地址: B站搜&#xff1a; 【毕设者】玩具租赁系统(安装讲解源码)

智慧园区综合平台解决方案PPT(75页)

## 智慧园区的理解 ### 从园区1.0到园区4.0的演进 1. 园区1.0&#xff1a;以土地经营为主&#xff0c;成本驱动&#xff0c;提供基本服务。 2. 园区2.0&#xff1a;服务驱动&#xff0c;关注企业成长&#xff0c;提供增值服务。 3. 园区3.0&#xff1a;智慧型园区&#xff…

WordPress免费模板:惊艳动态效果,打造视觉盛宴

WordPress免费模板&#xff1a;惊艳动态效果&#xff0c;打造视觉盛宴 我们为您带来了一款独具特色的WordPress免费模板&#xff0c;这款模板以其独特的动态效果设计&#xff0c;特别是引人注目的动态banner图片效果&#xff0c;为您的网站注入活力&#xff0c;打造一场视觉盛…

[渗透测试] 任意文件读取漏洞

任意文件读取漏洞 概述 漏洞成因 存在读取文件的功能&#xff08;Web应用开放了文件读取功能&#xff09;读取文件的路径客户端可控&#xff08;完全控制或者影响文件路径&#xff09;没有对文件路径进行校验或者校验不严格导致被绕过输出文件内容 漏洞危害 下载服务器中的…

spring boot (shiro)+ websocket测试连接不上的简单检测处理

1、用前端连接测试的demo一切正常&#xff0c;但是到了项目中连接不上了 一开始以为是地址错&#xff0c;但是换了apifox测试也是不可以。 2、考虑是shiro进行了拦截了&#xff0c;所以就访问不到了地址&#xff0c;那么就放行。 3、再次用apifox测试&#xff0c;成功了。 当然…

【CSS in Depth 2 精译】2.2 em 和 rem + 2.2.1 使用 em 定义字号

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem ✔️ 2.2.1 使用 em 定义字号 ✔️2.2.2 使用 rem 设置字号 2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.…

复分析——第9章——椭圆函数导论(E.M. Stein R. Shakarchi)

第 9 章 椭圆函数导论 (An Introduction to Elliptic Functions) The form that Jacobi had given to the theory of elliptic functions was far from perfection; its flaws are obvious. At the base we find three fundamental functions sn, cn and dn. These functio…

一文解决图论中有向图、无向图、非负加权图的单源最短路径问题【超详细】【通用模板程序】【深入分析】【无需基础】【c++】

本文致力于提供一种解决图论中所有&#xff08;或绝大部分&#xff09;有向图、无向图、非负加权图的单源最短路径问题的通用程序模板&#xff0c;本文提供的模板并不是简单的可行模板&#xff0c;而是经过深入分析解释的一个较高质量和性能的通用程序模版。在每个关键变量存储…

JavaSE期末复习速成笔记

面向对象 1. 面向对象的概念 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它将现实世界的事物抽象为对象&#xff0c;通过类和对象来创建各种功能模块&#xff0c;以此来设计和开发软件。 2. 类与对象 类&#xff1a;是对象的模板&#xff0c;定义了…