Ucore操作系统实验——Day1

Ucore操作系统实验第一天

Linux下常用命令

Linux文件方面命令

ls,pwd,cd,mkdir,cp,mv,rm,touch,cat,echo
  1. ls命令

ls命令查看当前文件夹下的文件分布,文件一般按照首字母进行排序

ls     #普通查看
ls -l  #显示文件详细的信息
ls -a  #显示所有文件,包括隐藏文件
ls -al #显示所有文件的详细信息,包括隐藏文件
ls -h  #以人类友好的形势显示文件信息,以Kb/Mb/Gb的形式给出文件的大小
ls -F  #显示文件时,文件夹后面会跟一个/,用于区分文件和文件夹
ls -s  #打印各个文件的大小
ls -help  #查看更多ls的命令

ls -al其实就是ls -als -l的联合使用

  1. pwd命令

查看当前所在目录是哪

zrs@ubuntu:~$ pwd
/home/zrs
  1. mkdir

创建一个文件夹

zrs@ubuntu:~$ mkdir newdic
zrs@ubuntu:~$ ls
Desktop    Downloads         learn  newdic    Public     Videos
Documents  examples.desktop  Music  Pictures  Templates
  1. cd

跳转目录,可以结合tab键,根据关键字匹配目录

zrs@ubuntu:~$ cd newdic/
zrs@ubuntu:~/newdic$ 
cd ../  # 是返回上一级目录
  1. cp

复制文件,到特定目录下,可以加 -v显示详细信息,一般的命令都有一个-v选项,因为Linux在执行命令时不会显示详细得操作过程,可以通过选项-v来显示操作过程

cp [选项] [源文件目录] [目标文件目录]
zrs@ubuntu:~/newdic$ ls
file.txt
zrs@ubuntu:~/newdic$ cp -v file.txt file_copy.txt
‘file.txt’ -> ‘file_copy.txt’
zrs@ubuntu:~/newdic$ ls
file_copy.txt  file.txt
  1. mv

移动文件

mv [选项] [被移动源文件目录] [目标目录]
zrs@ubuntu:~/newdic$ mv -v file.txt hello.txt
‘file.txt’ -> ‘hello.txt’
zrs@ubuntu:~/newdic$ ls
file_copy.txt  hello.txt
  1. rm

删除文件或删除目录

rm [option] 被删除文件
#例如
rm  -Rf/            # 删除计算机上的所有文件,千万不要脑残
rm -i               # 再删除文件时,显示一个条是否删除的确认消息,确认后,他才会删除,也可以防止上面的脑残命令
rm -d [待删除文件夹]  # 删除一个空的文件夹
rm -r [待删除文件夹]  # 删除一个文件夹,并且删除它里面的所有文件 
rm -v [待删除文件]    # 显示删除的细节

也可以为命令添加其它的操作,相当于注记符一样,个性化命令

alias rm = "rm -i"

这样的话,你每次删除文件都会给你提供一个是否删除的信息

zrs@ubuntu:~/newdic$ ls
file_copy.txt  hello.txt
zrs@ubuntu:~/newdic$ rm -i file_copy.txt
rm: remove regular file ‘file_copy.txt’? y
zrs@ubuntu:~/newdic$ ls
hello.txt
  1. touch

创建文件

touch 文件名
zrs@ubuntu:~/newdic$ touch test.txt
zrs@ubuntu:~/newdic$ ls
hello.txt  test.txt 
  1. cat

查看文件内容

zrs@ubuntu:~/newdic$ cat hello.txt
helloworld
  1. echo

输出信息到命令行,或者输入文本到文件中

# 在命令行输出helloworld
zrs@ubuntu:~/newdic$ echo helloworld
helloworld
# 将文本文件写入一个文件中
zrs@ubuntu:~/newdic$ ls
hello.txt
zrs@ubuntu:~/newdic$ echo I am a file > file.txt
zrs@ubuntu:~/newdic$ ls
file.txt  hello.txt
zrs@ubuntu:~/newdic$ cat file.txt
I am a file

Linux重定向功能

Linux命令说白了就是处理之后显示一堆信息到命令行,计算机无非就是读取、处理、输入、输出,对于我个人的理解,命令行无非就是一个输入输出的中介,你输入一个命令,命令行提交给后台处理,然后输出一个命令,命令行显示出来,命令从哪里来?通过什么途径?难道只有从键盘输入的就叫命令吗?答案当然不是,命令无非就是一系列字符嘛,**既然能从键盘中输入命令,那为什么不能从文件中读取命令?,既然能从命令行输出信息,那为什么不能将输出信息输入到文件中?**起初对这个重定向功能不太理解,后来突然思考到这四个问题,就有点感觉了

Linux除了基本的键盘输入命令之外,还可以从文件中读取命令,可以将输出信息输出到命令行,那么也可以将输出信息输出到文件(可能这个理解还是比较狭隘)

如果把命令行理解为一个文件而不是一个终端是不是就能更好的理解这个重定向了,就我个人的理解,重定向应该是冲新定义命令输入输出方式和形式

# 将命令的输出信息输入到文件中可以通过
command > file  # 如果这个file存在,会将其内容删除,再将输出写进去,如果不存在会创建新文件
command >> file # 这个会在file后面追加内容

示例

zrs@ubuntu:~/newdic$ touch file.txt  # 创建一个新文件file.txt
zrs@ubuntu:~/newdic$ ls > file.txt  # 执行ls命令将输出写入file.txt
zrs@ubuntu:~/newdic$ cat file.txt  # 查看file.txt
file.txt
zrs@ubuntu:~/newdic$ ls -l >> file.txt  
zrs@ubuntu:~/newdic$ cat file.txt
file.txt
total 4
-rw-rw-r-- 1 zrs zrs 9 Aug 19 20:33 file.txt

也可以在文件中定义命令,从文件中读取命令,这里需要使用到read命令

# read命令
read [-option] [variables]  # option是按照什么方法读取,variables是读取后存放的变量,可以是一个或多个,这两者都是可选项,如果都省略,read读取的数据将会存放在环境变量REPLY中
选项说明
-a array把读取的数据赋值给数组 array,从下标 0 开始。
-d delimiter用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter)。
-e在获取用户输入的时候,对功能键进行编码转换,不会直接显式功能键对应的字符。
-n num读取 num 个字符,而不是整行字符。
-p prompt显示提示信息,提示内容为 prompt。
-r原样读取(Raw mode),不把反斜杠字符解释为转义字符。
-s静默模式(Silent mode),不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这是很有必要的。
-t seconds设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败。
-u fd使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。

(表格引自c++中文网)

hello.txt文件里面的内容为

zrs@ubuntu:~/newdic$ cat hello.txt
echo "helloworld" > file.txt
ls
cat file.txt

根据重定向,从hello.txt中读取命令逐个执行

zrs@ubuntu:~/newdic$ while read -r line
> do
> echo $line
> eval $line
> done < hello.txt;  # 代码部分,从hello.txt逐行读取命令,输出命令后并执行
echo "helloworld" > file.txt  # 从这一行开始就是命令执行体
ls
file.txt  hello.txt
cat file.txt
helloworld

Linux查看后台进程

Linux可以通过pc查看后台正在运行的进程,可以通过Ctrl+z挂起当前正在执行的进程

ps [options]    # 查看当前运行的所有进程
ctrl+z          # 挂起当前正在执行的进程
bg              # 进程转入后台运行
fg              # 调度进程切换到前台运行,并不一定调度出来的就是你上次切换到后台的线程
ctrl+c          # 杀死一个前台进程

示例

zrs@ubuntu:~/newdic$ ps
   PID TTY          TIME CMD
  5219 pts/4    00:00:00 bash
  5847 pts/4    00:00:00 vim
  5853 pts/4    00:00:00 vim
  5862 pts/4    00:00:00 vim
  8517 pts/4    00:00:00 vim
 14273 pts/4    00:00:00 ps
zrs@ubuntu:~/newdic$ sleep 60
^Z
[5]+  Stopped                 sleep 60
zrs@ubuntu:~/newdic$ bg
[5]+ sleep 60 &
zrs@ubuntu:~/newdic$ fg
vim hello	(wd: ~)

Ubnutu Linux软件包管理

Ubnutu的软件包是apt,可以通过apt去获取一些满足要求的软件包,他会自动帮你下载解压安装下来,一般apt会与sudo使用

sudo apt-get install <package> <package>.. [按Enter键]           # 安装软件包,sudo代表系统管理员,会安装或升级有关package和其依赖
sudo apt-get remove <package> [按Enter键]            # 删除软件包和其依赖
sudo apt-cache search <pattern> [按Enter键]          # 搜索满足pattern条件的软件包
sudo apt-cache show/showpkg <package> [按Enter键]    # 详细显示软件包package的信息
sudo apt update                                      # 列出所有可更新的软件清单命令
sudo apt upgrade                                     # 升级软件包
sudo apt list --upgradeable                          # 列出所有可更新的软件包以及其版本信息
sudo apt full-upgrade                                #升级软件包,升级前会删除需要更新的软件包
sudo apt update <package_name>                       #更新指定的软件
sudo apt autoremove                                  # 清理不在使用的依赖和库文件
sudo apt purge <pkg_name>                            #移出软件包以及配置文件
sudo apt list --installed                            # 列出所有已经安装的软件包信息
sudo apt list --all-versions                         # 列出所有已安装的包的版本信息

示例

zrs@ubuntu:~/newdic$ sudo apt-cache show gcc
[sudo] password for zrs: 
Package: gcc    # 如果存在的话,下面就是这个软件包的详细信息
Priority: optional
Section: devel
Installed-Size: 41
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
........ # 后面省略很多软件包输出信息
zrs@ubuntu:~/newdic$ sudo apt-cache search gcc  # 所有与gcc有关的信息都会罗列出来
autoconf2.64 - automatic configure script builder (obsolete version)
cpp - GNU C preprocessor (cpp)
cpp-4.7 - GNU C preprocessor
................................................ # 有很多...
python-clang-3.5 - Clang Python Bindings
python-clang-3.6 - Clang Python Bindings
python-clang-3.8 - Clang Python Bindings
python-clang-3.9 - Clang Python Bindings

Vim编辑器

所有的Linux上都是默认安装vi编辑器的,但是vi的功能不是太多,所有从vi的基础上有了vim,他有着丰富的语法高亮辨识,以及可以用来编写代码,对于熟练的程序猿来说,十分好用,首先需要安装vim

sudo apt-get install vim

在这里插入图片描述

图片源自菜鸟教程

使用vim

zrs@ubuntu:~/newdic$ vim --version  # 查看vim的版本
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:43:18)
Included patches: 1-52
Extra patches: 8.0.0056
........                            # 后面省略很多信息  
zrs@ubuntu:~/newdic$ vim            # 启动vim

在这里插入图片描述

这为vim的界面

Vim一共分为四种模式

  • 插入模式(Insert)
  • 命令模式(Command)
  • 底线命令模式(Last Line Command)

刚进入vim的时候,模式为命令模式,你的输入都会被当作命令,按i键会进入插入模式,按esc又会退出插入模式,:+回车会进入底线命令模式

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

示例

zr的帅气honor@LAPTOP-2AOGK40F MINGW64 ~/Desktop/newdif  # 打开文件hello.txt在其中输入helloworld保存退出
$ vim hello.txt
zr的帅气honor@LAPTOP-2AOGK40F MINGW64 ~/Desktop/newdif  # 查看hello.txt
$ cat hello.txt
helloworld!

进入vim之后,先按i进入插入模式,然后输入helloworld,然后按Esc退出插入模式,进入命令模式,输入:wq并按回车键退出,w代表写,q代表quit

除了这些操作之外,vim还有很多其它的操作,具体可以上网搜一下

为了方便编码,需要对vim做一些配置,首先需要在~/文件加下找到.vimrc文件,~代表你的用户目录,使用ls -a,因为这是一个隐藏文件,如果不存在这个文件,可以创建一个.vimrc文件,然后在里面输入下面的文件,最后保存退出即可

在这里插入图片描述

1. set nocompatible 
2. set encoding=utf-8 
3. set fileencodings=utf-8,chinese 
4. set tabstop=4 
5. set cindent shiftwidth=4 
6. set backspace=indent,eol,start 
7. autocmd Filetype c set omnifunc=ccomplete#Complete 
8. autocmd Filetype cpp set omnifunc=cppcomplete#Complete 
9. set incsearch
10. set number 
11. set display=lastline 
12. set ignorecase 
13. syntax on 
14. set nobackup 
15. set ruler 
16. set showcmd 
17. set smartindent 
18. set hlsearch 
19. set cmdheight=1 
20. set laststatus=2 
21. set shortmess=atI 
22. set formatoptions=tcrqn
23. set autoindent

然后就可以使用vim编辑代码了,比如用vim编写c文件

zrs@ubuntu:~/newdic$ vim hello.c  # 在里面编写c文件,打印helloworld
zrs@ubuntu:~/newdic$ ls
file.txt  hello.c  hello.txt
zrs@ubuntu:~/newdic$ cat hello.c
#include<stdio.h>
int main(){
	printf("Hello World!\n");
	return 0;
}

使用gcc

做这个实验需要掌握gcc的一些基本的功能,比如编译.c文件生成目标文件等等,首先检查是否安装gcc

sudo apt-get install build-essential

使用gcc编译源文件

就刚刚写的那个hello.c,现在来编译他,使用gcc编译源文件的基本命令是

gcc 源文件 -o 目标文件  # 目标文件为可执行文件

上面这种编译方法在编译时出现错误的时候不会给出任何提示,一般建议这样用,因为这样有助于检测程序,再出现问题的时候及时定位到错误

gcc -Wall 源文件 -o 目标文件

示例

zrs@ubuntu:~/newdic$ gcc -Wall hello.c -o aimfile  
zrs@ubuntu:~/newdic$ ls
aimfile  file.txt  hello.c  hello.txt  # aimfile为生成的可执行文件
zrs@ubuntu:~/newdic$ ./aimfile  # ./表示当前文件夹
Hello World!

gcc的其它命令可以上网查询

使用gdb调试程序

gdb全称GNU symbolic debugger,是Linux下经常会用到的程序调试器,已经有多个版本,能够对C、C++、Go、等等语言进行调试,他是一个命令行调试器,能够单步对代码进行调试,发现代码中的错误,它具有很多功能,如设置断点、查看变量赋值过程、显示\修改变量的值、修改寄存器的值等等

gdb基本命令

break filename:num  # 在当前调试程序的源文件的第num行设置断点
clear filename:num  # 清除目标源文件num行的断点
run                 # 运行调试程序
step                # 单步运行程序,不直接执行函数
next                # 单步运行程序,直接执行韩素
backtrace           # 显示所有调用栈帧,可以用来显示函数之间的调用关系
where continue      # 继续执行当前调试的程序
display EXPR        # 在以后的每一步展示表达式的值,表达式来自当前程序的变量的组合
file filename       # 装载并调试新的文件
help COMMAND        # 显示gdb命令的帮助信息
info break          # 显示当前断点的信息
info files          # 显示当前被调试文件的详细信息
info func           # 显示当前调试程序的所有函数名曾
info prog           # 显示被调试程序的执行状态
info local          # 显示被调试程序当前函数的局部变量信息
info val            # 显示被调用程序的所有全局和静态变量名称
kill                # 终止当前正在被调试的程序
list                # 显示被调试程序的源代码
quit                # 退出gdb

gdb的基本使用方法

gdb filename   # file必须是经过-g或-ggdb选项编译过之后的文件

下面有一段错误的代码,文件名为test.c,编译运行会报错

#include<stdio.h>
#include<stdlib.h>

static char buff[256];
static char* ptr;

int main(){
    printf("Please input a sentence:");
    gets(ptr);
    printf("The sentence that you input is %s\n",ptr);
    return 0;
}

下面用gdb进行调试,注意这个源文件在编译时要用这样的命令

Please input a sentence:hello
Segmentation fault (core dumped)

发现程序出错了,将程序放入gdb中进行调试

zrs@ubuntu:~/newdic$ gdb aimfile
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from aimfile...done.
(gdb) break test.c:7  # 在第七行设置断点
Breakpoint 1 at 0x400581: file test.c, line 7.
(gdb) run  # 开始调试程序
Starting program: /home/zrs/newdic/aimfile 

Breakpoint 1, main () at test.c:8
8		printf("Please input a sentence:");
(gdb) next  # 不断单步执行
9		gets(ptr);
(gdb) next
Please input a sentence:hello   # 最后发现是在gets这里出了问题

Program received signal SIGSEGV, Segmentation fault.
_IO_gets (buf=0x0) at iogets.c:54
54	iogets.c: No such file or directory.
(gdb) 

虽然这个问题很简单,只是一个实例,问题是出在指针没有初始化,需要给指针进行一个初始化,即

#include<stdio.h>
#include<stdlib.h>

static char buff[256];
static char* ptr;

int main(){
    ptr = buff;
    printf("Please input a sentence:");
    gets(ptr);
    printf("The sentence that you input is %s\n",ptr);
    return 0;
}

这样修改之后,程序就会正常运行了,再次编译并运行程序,会得到下面的结果

zrs@ubuntu:~/newdic$ gcc -o aimfile -g test.c
zrs@ubuntu:~/newdic$ ls
aimfile  hello.c  test.c
zrs@ubuntu:~/newdic$ ./aimfile
Please input a sentence:hello
The sentence that you input is hello  # 正常输出
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值