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

news2024/11/26 16:46:57

以下是关于嵌入式操作系统(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;

}

 

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

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

相关文章

【C++课程设计——演讲比赛系统】

文章目录 前言一、演讲比赛程序需求二、每个功能模块的实现1. 创建管理类(.h文件)2.1. 创建管理类(.cpp文件)3.创建参赛选手类(.h)4.将整体逻辑进行封装 测试项目总结 前言 在学习完C的stl容器后&#xff0c;我们来写一下小项目对其进行应用&#xff01; 项目名称为&#xff1…

cocos creator 调试插件

适用 Cocos Creator 3.4 版本&#xff0c;cocos creator 使用google浏览器调试时&#xff0c;我们可以把事实运行的节点以节点树的形式显示在浏览器上&#xff0c;支持运行时动态调整位置等、、、 将下载的preview-template插件解压后放在工程根目录下&#xff0c;然后重新运行…

day23-- 39. 组合总和+40.组合总和II + 131.分割回文串

一、 39. 组合总和 题目链接&#xff1a;https://leetcode.cn/problems/combination-sum/ 文章讲解&#xff1a;https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1KT4y1M7HJ 1.1 初见思路…

JAVA期末速成库(10)第十一章

一、习题介绍 Check Point&#xff1a;P416 11.1&#xff0c;11.6&#xff0c;11.7&#xff0c;11.8&#xff0c;11.12&#xff0c;11.17&#xff0c;11.24 Programming Exercise&#xff1a;11.1 二、习题及答案 Check Point&#xff1a; 11.1 True or false? A subcl…

Windows下activemq集群配置(broker-network)

1.activemq版本信息 activemq&#xff1a;apache-activemq-5.18.4 2.activemq架构 3.activemq集群配置 activemq集群配置基于Networks of Brokers 这种HA方案的优点&#xff1a;是占用的节点数更少(只需要2个节点),而且2个broker都可以响应消息的接收与发送。不足&#xff…

003-GeoGebra如何无缝嵌入到PPT里

GeoGebra无缝嵌入到PPT里真是一个头疼的问题&#xff0c;已成功解决&#xff0c;这里记录一下&#xff0c;希望可以帮助到更多人。 注意&#xff0c;后续所有的文章说的PPT都是Offce Power Point, 不要拿着WPS的bug来问我哦&#xff0c;我已经戒WPS了&#xff08;此处表示无奈&…

基于Spring Boot的校园失物招领系统

1 项目介绍 1.1 研究的背景及意义 在网络时代飞速发展的今天&#xff0c;随着网络技术日臻完善&#xff0c;我们的生活方式正经历深刻变革。在物质追求日益增长的同时&#xff0c;提升个人精神境界也成为了现代人的共同向往&#xff0c;而阅读则是滋养心灵、丰富精神世界的重…

Ubuntu Server 和 Ubuntu Desktop 组合使用

1.常见的组合使用方式 Ubuntu Server 和 Ubuntu Desktop 确实可以组合使用&#xff0c;但具体要看你的需求和使用场景。以下是一些常见的组合使用方式&#xff1a; 单一设备上安装&#xff1a;你可以在一台设备上同时安装 Ubuntu Server 和 Ubuntu Desktop。这样&#xff0c;你…

【SQL Server数据库】视图的使用

一、用SQL语句完成下列功能。 1&#xff0e;建立一视图View_CSTeacher&#xff0c;列出计算机系各个老师的资料(姓名、性别、职称)。 create view View_CSTeacher asselect Teac_name, Teac_sex, TechPostfrom Teacherwhere Depar_id in (select Depar_id from Deparment whe…

SpringCloudAlibaba基础四 微服务调用组件OpenFeign

JAVA 项目中如何实现接口调用&#xff1f; 1&#xff09;Httpclient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 …

无人机飞行操作技巧

要想充分利用无人机&#xff0c;掌握其操作技巧非常关键。以下是一些基础而重要的无人机操作技巧&#xff0c;可以帮助你更安全、更有效地使用无人机。 扫描式拍摄&#xff1a;这种方法涉及慢慢地将无人机从一个点移动到另一个点&#xff0c;同时保持相机对准一个特定的主题。…

Kafka 位移

Consumer位移管理机制 将Consumer的位移数据作为一条条普通的Kafka消息&#xff0c;提交到__consumer_offsets中。可以这么说&#xff0c;__consumer_offsets的主要作用是保存Kafka消费者的位移信息。使用Kafka主题来保存位移。 消息格式 位移主题就是普通的Kafka主题。也是…

windows MSVC编译安装libcurl

$ git clone https://github.com/curl/curl.git $ cd curl/winbuild依照curl/winbuild/README.md的指示&#xff0c; 启动visual studio的命令行工具&#xff0c;这里要注意别选错. 如果要编译出x64版本的libcurl&#xff0c;就用x64的命令行工具&#xff1b;如果要编译出x86…

VSCode插件开发经验小结

从零基础接手DX扩展开发维护&#xff0c;到完成DX扩展从O2平台迁移到 VSCode 平台&#xff0c;现在也积累了一些经验&#xff0c;本文将对这一过程中的学习经历做一个简单小结&#xff0c;也希望可以通过本文帮助想要开发 VSCode 扩展的同学可以更快速的上手。 VSCode (Visual …

福昕阅读器再打开PDF文件时,总是单页显示,如何设置打开后就自动显示单页连续的模式呢

希望默认进入连续模式 设置方法 参考链接 如何设置使福昕阅读器每次启动时不是阅读模式 每次启动后都要退出阅读模式 麻烦_百度知道 (baidu.com)https://zhidao.baidu.com/question/346796551.html#:~:text%E5%9C%A8%E3%80%90%E5%B7%A5%E5%85%B7%E3%80%91%E9%87%8C%E6%9C%89%E…

使用ROS2的RCLCPP客户端库来实现话题通信

1.创建发布者目录文件 cd d2lros2/ mkdir -p chapt3/chapt3_ws/src cd chapt3/chapt3_ws/src 2.创建发布者节点 ros2 pkg create example_topic_rclcpp --build-type ament_cmake --dependencies rclcpp 3.新建发布者类 touch example_topic_rclcpp/src/topic_publisher_01.…

[CAN] Intel 格式与 Motorola 格式的区别

编码格式 数据传输规则一、Intel 格式编码二、Motorola 格式编码三、分析总结🙋 前言 CAN 总线信号的编码格式有两种定义:Intel 格式与 Motorola 格式。究竟两种编码格式有什么样的区别呢?设计者、dbc 文件编辑者或者测试人员又该如何判断两种格式,并进行有效正确的配置和解…

下载旧版本vscode及扩展,离线下载远程linux服务器插件

背景 工作的内网没有网络&#xff0c;无法使用网络来下载插件和vscode软件&#xff0c;且有远程linux服务器需求&#xff0c;linux服务器中lib相关库比较旧且无法更新&#xff0c;所以需要选择一个旧版本的vscode&#xff0c;相应插件也需要选择旧版本的 旧版本vscode下载 没…

SQL 29 计算用户的平均次日留存率题解

问题截图如下&#xff1a; SQL建表代码&#xff1a; drop table if exists user_profile; drop table if exists question_practice_detail; drop table if exists question_detail; CREATE TABLE user_profile ( id int NOT NULL, device_id int NOT NULL, gender varchar…

金融科技如何以细颗粒度服务提升用户体验与满意度

在金融科技迅速发展的当下&#xff0c;各种技术手段被广泛应用于提升用户体验与满意度。这些技术手段不仅提供了更为精准、个性化的服务&#xff0c;还通过优化操作流程、提升服务效率等方式&#xff0c;显著改善了用户的金融生活。以下将详细探讨金融科技如何运用这些技术手段…