嵌入式Linux

Linux的目录结构

ea97427822d54d63a2734f0c24d35b8e.png

路径描述的层次关系用/来表示

下面是对每个目录的介绍


  • /:根目录,最顶级的目录,包含整个文件系统的根。

  • /bin:二进制可执行文件。

  • /boot:启动相关的文件,包括内核和引导加载程序。

  • /dev:设备文件,包括硬件设备和外部设备。

  • /etc:系统配置文件。

  • /home:用户的主目录。

  • /lib:共享库文件。

  • /media:可移动媒体设备的挂载点。

  • /mnt:临时挂载目录。

  • /opt:可选软件包的安装目录。

  • /proc:虚拟文件系统,包含运行中的进程和系统信息。

  • /root:超级用户(root)的主目录。

  • /run:运行时文件,包含运行中的进程和系统信息。

  • /sbin:系统管理员使用的二进制可执行文件。

  • /srv:服务相关的数据。

  • /sys:虚拟文件系统,包含与内核相关的信息。

  • /tmp:临时文件。

  • /usr:用户程序和数据。

  • /var:可变数据,包括日志文件、数据库文件等。


Linux基础知识

shell

1、什么是命令? 命令是用户向系统内核发出控制请求,与之交互的文本流。

2、Shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互。 同时,Shell为操作系统提供了内核之上的功能,直接用来管理和运行系统。

3、Shell脚本文件 :当需要重复执行若干命令,可以将这些命令集合起来,加入一定的控制语句,编辑成为Shell脚本文件,交给Shell批量执行。

 //创建一个shell脚本文件:test.sh 
   cd /
   ls
   cd ~
   ls
   rm a.c b.c
   ls
 //修改shell脚本文件的权限,添加一个可执行权限
chmod a+x test.sh
 //运行shell脚本文件

 4、快捷键

        ctrl + e 将光标移动到行尾

        ctrl + a 将光标移动到行首

        ctrl + l 清屏

        tab键 自动补齐(命令,文件名)

5、通配符

        * 匹配任意长度的字符串

        ? 匹配任意的一个字符

例如:

   liping@ubuntu:~/2308/linux$ ls
   1.txt  2.txt  3.txt  a.c  b.c  c.c
   liping@ubuntu:~/2308/linux$ rm *       //删除当前目录下的所有文件
   liping@ubuntu:~/2308/linux$ ls

例如:

   liping@ubuntu:~/2308/linux$ ls
   1.txt  2.txt  3.txt  a.c  b.c  c.c  hello.c  test.c
   liping@ubuntu:~/2308/linux$ rm ?.c      //删除文件名为一个字符的.c文件
   liping@ubuntu:~/2308/linux$ ls
   1.txt  2.txt  3.txt  hello.c  test.c

隐藏文件、文件夹

在Linux中以.开头的,均是隐藏文件。

默认不显示。

HOME目录

每一个用户在Linux系统中都有自己的专属工作目录,称之为HOME目录。

  • 普通用户的HOME目录,默认在:/home/用户名

  • root用户的HOME目录,在:/root

//FinalShell登陆终端后,默认的工作目录是用户的HOME目录

相对路径、绝对路径

  • 相对路径,非/开头的称之为相对路径

    相对路径表示以当前目录作为起点,去描述路径。

  • 绝对路径,以/开头的称之为绝对路径

    绝对路径从开始描述路径。

特殊路径符

  • .表示当前,比如./a.txt,表示当前文件夹内的a.txt文件

  • ..表示上级目录,比如../表示上级目录,../../表示上级的上级目录

  • ~表示用户的HOME目录,比如cd ~,即可切回用户HOME目录

vim编辑器

注:vim编译器是vi编译器的升级版,使用前需要安装

1、模式

命令模式 、编辑模式、 底行模式

2、命令模式下的命令

yy复制一行
nyy复制n行
yw复制一个单词
y$复制从光标到行尾
dd剪切一行
ndd剪切n行
dw剪切一个单词
d$剪切从光标到行尾
x剪切一个字符
p粘贴
u撤销

o

在光标所在行的下面另起一新行进入插入模式

查找:

 /[要查找的内容]     查找上一个:N     查找下一个:n  

3、底行模式下的操作

替换:

:%s/old_string/new_string/g     //替换文件中所有的old_string
:s/old_string/new_string/g     //替换光标所在行中所有的old_string
:s/old_string/new_string/g    //替换光标所在行中第一个的old_string

一个窗口打开多个文件:

 :vs 文件名

黏贴别的文件的内容:

    :r [带路径的文件名]

4、编辑模式下的操作

自动补齐: ctrl + n

5、配置vim

//打开配置文件

sudo vim /etc/vim/vimrc

//在文件末尾添加下面内容:

   set number      #显示行号
   set mouse=a     #设置鼠标可用
   set cindent      #设置按c语言的语法自动缩进
   set st=4        #设置tab键的宽度
   set sts=4
   set sw=4

//使之生效

peter@ubuntu:~$ source /etc/vim/vimrc  
   -bash:  All system-wide defaults are set in /debian.vim and sourced by
   : No such file or directory
   -bash:  settings, you should do it in this file (/etc/vim/vimrc), since debian.vim
   : No such file or directory
   It is recommended to make changes after sourcing debian.vim since it alters
   : command not found
   This line should not be removed as it ensures that various options are
   : command not found
   runtime!: command not found
   -bash: /etc/vim/vimrc: line 13: synta   x error near unexpected token `('
   -bash: /etc/vim/vimrc: line 13: `" This happens after /etc/vim/vimrc(.local) are loaded, so it will override'

注:上面打印的信息不是错误,我们忽略即可。

环境变量

  • 临时设置:export 变量名=变量值

  • 永久设置:

    • 针对用户,设置用户HOME目录内:.bashrc文件

    • 针对全局,设置/etc/profile

PATH变量

记录了执行程序的搜索路径

可以将自定义路径加入PATH内,实现自定义命令在任意地方均可执行的效果

特殊IP

  • 127.0.0.1,表示本机

  • 0.0.0.0

    • 可以表示本机

    • 也可以表示任意IP(看使用场景)

权限掩码

在Ubuntu中,umask是一个用于设置默认文件和目录权限的命令。umask命令可以用来设置或显示当前用户或进程的文件创建权限掩码。

文件和目录的权限由三个组成部分组成:所有者权限、组权限和其他用户权限。每个权限可以是读取(r)、写入(w)或执行(x)。

umask命令的语法如下:

umask [-S] [mode]

其中,-S选项用于以符号形式显示当前的umask值,mode参数用于设置新的umask值。

如果没有指定mode参数,则umask命令将显示当前的umask值。umask值以八进制形式表示,表示了文件和目录权限的掩码。

例如,默认的umask值为0022,表示新创建的文件权限为644(rw-r--r--),新创建的目录权限为755(rwxr-xr-x)。

要更改umask值,可以使用以下命令:

umask new_umask_value

其中,new_umask_value是新的umask值,以八进制形式表示。

注意:umask值是通过将新的umask值与当前umask值进行按位与运算来计算的。因此,新的umask值应为当前umask值的补码。

要永久更改umask值,可以将其添加到bash配置文件(如~/.bashrc/etc/bash.bashrc)中。这样,在每个新的终端会话中,umask值将自动设置为所需的值。

Linux常用命令

ls命令

功能:列出指定目录下信息

语法:ls [-l -h -a] [参数]

  • 参数:被查看的文件夹(不提供参数,默认查看当前工作目录)

  • -l,以列表形式查看

  • -h,配合-l,显示文件大小单位

  • -a,显示隐藏文件

pwd命令

功能:展示当前工作目录

语法:pwd

cd命令

功能:切换工作目录

语法:cd [目标目录]

目标目录:要切换去的地方(不提供默认切换到当前登录用户HOME目录)

mkdir命令

功能:创建文件夹

语法:mkdir [-p] 参数

  • 参数:被创建文件夹的路径

  • 选项:-p,可选,表示创建前置路径

    例如: 递归创建多层目录 mkdir -p hello/world  即创建hello,然后在hello中创建world

touch命令

功能:创建文件

语法:touch 参数

  • 参数:被创建的文件路径

cat命令

功能:查看文件内容

语法:cat 参数

  • 参数:被查看的文件路径

more命令

功能:查看文件,可以支持翻页查看

语法:more 参数

  • 参数:被查看的文件路径

  • 在查看过程中:

    • 空格键翻页

    • q退出查看

cp命令

功能:复制

语法:cp [-r] 参数1 参数2

  • 参数1,被复制的

  • 参数2,要复制去的地方

  • 选项:-r,可选,复制文件夹使用

示例:

  • cp a.txt b.txt,复制当前目录下a.txt为b.txt

  • cp a.txt test/,复制当前目录a.txt到test文件夹内,若不存在test文件夹则自动创建

  • cp -r test test2,复制文件夹test为当前目录下的test2

mv命令

功能:移动文件、文件夹

语法:mv 参数1 参数2

  • 参数1:被移动的

  • 参数2:要移动去的地方,参数2如果不存在,则会进行改名

rm命令

功能:删除文件、文件夹

语法:rm [-r -f] 参数...参数

  • 参数:支持多个,用空格进行分隔

  • 选项:-r,删除文件夹使用

  • 选项:-f,强制删除,不会给出确认提示,一般root用户会用到

which命令

功能:查看命令的程序本体文件路径

语法:which 参数

  • 参数:被查看的命令

find命令

功能:搜索文件

语法:find 路径 -name 参数

  • 路径,搜索的起始路径

  • 参数,搜索的文件名,支持通配符*, 比如:*test表示搜索任意以test结尾的文件

grep命令

功能:过滤

语法:grep [选项] 关键字 文件路径

  • -n           //显示字符串所在的行号

  • -r            //如果查找的为目录有子目录,则递归进入子目录中查找

  • 关键字:必填,表示需要过滤的关键字,如果带有空格或其它特殊符号,需要使用" "包围

wc命令

功能:统计

语法:wc [-c -m -l -w] 文件路径

  • 选项,-c,统计bytes数量

  • 选项,-m,统计字符数量

  • 选项,-l,统计行数

  • 选项,-w,统计单词数量

  • 参数,文件路径,被统计的文件,可作为内容输入端口

管道符|

写法:|

功能:将符号左边的结果,作为符号右边的输入

示例:

cat a.txt | grep hello,将cat a.txt的结果,作为grep命令的输入,用来过滤hello关键字

可以支持嵌套:

cat a.txt | grep hello | grep world

echo命令

功能:输出内容

语法:echo 参数

  • 参数:被输出的内容

`反引号

功能:被两个反引号包围的内容,会作为命令执行

示例:

  • echo pwd,会输出当前工作目录

tail命令

功能:查看文件尾部内容,默认显示文件最后10行。

语法:

tail [-f] filename

  • filename:被查看的文件,可以是相对路径或绝对路径。

  • -f:实时显示文件filename的内容,当文件内容发生变化时,自动更新显示。

tail -n num filename

显示文件的最后num行内容

tail -c num filename

显示文件filename的最后num个字节内容

tail -n +num filename

显示文件filename从第num行开始到末尾的所有内容

head命令

功能:查看文件头部内容,默认显示文件的前10行。

语法:

head [-n] 参数

  • 参数:被查看的文件

  • 选项:-n,查看的行数

help命令

可以通过:命令 --help查看命令的帮助手册

432bcb5bcc1c48c48439f837f4438b9c.png

重定向符

功能:将符号左边的结果,输出到右边指定的文件中去

  • >表示覆盖输出

  • >>表示追加输出

man命令

可以通过man 命令查看某命令的详细手册 ,使用man命令可以找到特定的联机帮助页,并提供简短的命令说明。

通常联机帮助信息包括以下几个部分:

     NAME:命令的名称
     SYNOPSIS:命令的常用参数
     DESCRIPTION:命令的一般描述以及用途
     OPTIONS:描述命令所有的参数或选项
     SEE ALSO:列出联机帮助页中与该命令直接相关或功能相近的其他命令
     BUGS:解释命令或其输出中存在的任何已知的问题或缺陷
     EXAMPLES:普通的用法示例
     AUTHORS:联机帮助页以及命令的作者

man手册中分章节,每个章节内容不同,前三章如下:

    1  Executable programs or shell commands   //shell命令
    2  System calls (functions provided by the kernel)   //系统调用
    3  Library calls (functions within program libraries)  //C的库函数

语法:man [参数] [命令]

参数:-f,查看命令或函数所在的章节

  liping@ubuntu:~/2308/linux$ man -f printf
   printf (1)      - format and print data
   printf (3)      - formatted output conversion

查看指定章节中的函数:

man 3 printf

ps命令

功能:查看进程信息,如进程ID、父进程ID、进程状态、CPU使用率、内存使用情况等。

语法:ps -ef

查看全部进程信息

搭配grep做过滤:

ps -ef | grep xxx

常见的参数:

 -e 列出所有的进程,包括其他用户的。 
 -f 显示进程的详细信息,包括进程的用户、进程ID、父进程ID、CPU使用率、内存使用情况等。 
 -u user 显示指定用户的进程 
 -p pid 显示指定进程ID的进程 
 -r 只显示正在运行的进程
 -s 按进程的内存使用情况排序

进程状态:

   D:    不可中断的阻塞    
   R:    正在执行中 
   S:    阻塞状态 
   T:    暂停执行 
   Z:    不存在但暂时无法消除 
   W:     没有足够的内存分页可分配 
   <:    高优先级的进程 
   N:    低优先级的进程 
   L:    有内存分页分配并锁在内存中

kill命令

功能:终止进程

语法:kill  [-signal]  PID 

signal是信号,PID是进程号

kill 命令向指定的进程发出一个信号signal,在默认的情况下,kill 命令向指定进程发出信号15,正常情况下,将杀死那些不捕捉或不忽略这个信号的进程。

下面这行命令可打印出所有信号说明:

liping@ubuntu:~/2308/linux$ kill -l
常用:kill [-9] 进程ID

选项:-9,表示强制关闭进程。不使用此选项会向进程发送信号要求其关闭,但是否关闭看进程自身的处理机制。

su命令

切换用户

语法:su [-] [用户]

894e8c21cc4b620dd0681ad65cedb470.png

sudo命令

7e302e2430e93651a26928578ba9efd5.png

比如:

liping ALL=(ALL)       NOPASSWD: ALL

在visudo内配置如上内容,可以让liping用户,无需密码直接使用sudo

ping命令

测试网络是否联通

语法:ping [-c num] 参数

选项:-c,检查的次数,不使用-c选项,将无限次数持续检查

参数:ip或主机名,被检查的服务器的ip地址或主机名地址

示例:

检查到baidu.com是否联通

612df1b0afde43418f9bf11c0febade6.png

结果表示联通

tar命令(压缩/解压)

tar命令一般语法格式为:

tar  [ -t | -x | -u | -c | -v | -f | -j | -z ]  tarfile  filelist

选项 描述

   -t     显示归档文件中的内容
   -x     释放归档文件
   -u     更新归档文件
   -c     创建一个新的归档文件
   -v     显示归档和释放的过程信息
   -f     用户指定归档文件的文件名,否则使用默认名称
   -j     由tar生成归档,然后由bzip2压缩
   -z     由tar生成归档,然后由gzip压缩

例如:

  tar -cvjf test.tar.bz2 *     //将当前目录中所有文件打包并压缩成:test.tar.bz2
   
 tar -xvjf test.tar.bz2      //将test.tar.bz2解压,并释放归档  或 tar -xvf test.tar.bz2

 tar -cvzf test.tar.gz *      //将当前目录中所有文件打包并压缩成:test.tar.gz

 tar -xvzf test.tar.gz      //将test.tar.gz解压,并释放归档   或 tar -xvf test.tar.gz
 
 tar -cvJf test.tar.xz *     //将当前目录中所有文件打包并压缩成:test.tar.xz
 
 tar -xvJf test.tar.xz      //将test.tar.xz解压,并释放归档  或 tar -xvf test.tar.xz

nmap命令

第一次使用,请先安装:yum -y install nmap

作用:查看端口的占用情况

语法:nmap 被查看的ip地址

可以看到,本机(127.0.0.1)上有6个端口现在被程序占用了。

其中:22端口,一般是SSH服务使用,即FianlShell远程连接Linux所使用的端口

netstat命令

功能:查看端口占用

用法:netstat -anp | grep xxx

wget命令

wget是非交互式的文件下载器,可以在命令行下载网络文件

语法:wget [-b] url

选项:-b,可选,后台下载,会将日志写入到当前工作目录的wget-log文件

参数:url,下载连接

通过tall命令可以监控后台下载进度:tall -f wget-log

注:无论下载是否完成,都会生产要下载的文件,如果下载未完成,请及时清理未完成的不可以文件

curl命令

第一次使用请先安装:

sudo apt install curl

57ef050ab1f14e201ab04020918c5bac.png

示例:用curl访问百度

curl www.baidu.com

top命令

功能:查看主机运行状态

语法:top,查看基础信息

可用选项:

cc7cb92386a26f3ba9146a51a9f8d4e0.png

交互式模式中,可用快捷键:

b30277ce6a79e12f9e5ce9cd301e1590.png

df命令

查看磁盘占用

语法:df [-h]

选项:-h,开启单位显示

b2a1bb8ca6114720870abe53a359de23.png

3f2e9a51743f41d78af39150321f0bdb.png

du命令

列出目录和文件所使用的磁盘块数,每块占512个字节。

语法:du [选项] [文件或目录]

  • 如果不指定文件或目录,则默认为当前目录

常用参数:

-a :显示每个文件或目录的磁盘使用情况,包括隐藏文件。

-s :列出总的磁盘的使用情况(KB)

-h:以人类可读的格式显示磁盘使用情况,例如使用K、M、G等单位。

例:

liping@ubuntu:~$ du -sh 2308/

12K 2308/

mount挂载命令

实操练习:

第一步:插上U盘,选择连接到虚拟机

第二步:在虚拟机中,查看U盘对应的设备名称 cat /proc/partitions 8 16 30277632 sdb //表示U盘设备 8 17 29706240 sdb1 //表示分区

 或者查看磁盘信息
 peter@ubuntu:~$ df -a
 /dev/sdb1    29706236 25178188  4528048  85% /media/peter/peter
 
 第三步:创建一个挂着U盘的挂载点
   peter@ubuntu:~$ mkdir udisk
   
 第四步:将U盘挂载到上面的创建的挂载点
peter@ubuntu:~$ sudo mount /dev/sdb1  ./udisk/
       Mount is denied because the NTFS volume is already exclusively opened.
       The volume may be already mounted, or another software may use it which
       could be identified for example by the help of the 'fuser' command.

//挂载时,如果提示上面的错误,说明有进程正在使用设备,需要杀死该进程 ​

第五步:查看正在设备的进程 ​

peter@ubuntu:~$ sudo fuser -m /dev/sdb1
       /dev/sdb1:       7434

第六步:杀死上面的进程 ​

peter@ubuntu:~$ sudo kill 7434

第七步:重新挂载

peter@ubuntu:~$ sudo mount /dev/sdb1  ./udisk/

第八步:查看挂载点udisk里面的文件

peter@ubuntu:~$ ls udisk/

//如果上面显示了u盘中的内容,说明挂载成功了 第九步:卸载 umount ​ 例如:将上面挂载的U盘,卸载掉 ​

peter@ubuntu:~$ sudo umount udisk

ln命令

功能:创建文件、文件夹软链接(快捷方式)

语法:ln -s 参数1 参数2

  • 参数1:被链接的

  • 参数2:要链接去的地方(快捷方式的名称和存放位置)

Linux中有两种类型的链接:

1、硬链接 ----给文件取别名 硬链接是利用Linux中为每个文件分配的物理编号——inode建立链接。因此,硬链接不能跨越文件系统。

2、软链接(符号链接)----类似于Windows快捷方式 软链接是利用文件的路径名建立链接。通常建立软链接使用绝对路径而不是相对路径,以最大限度增加可移植性。

3、创建硬链接 ln hello.c y.c

 liping@ubuntu:~/2308/linux$ ls -l hello.c y.c
   -rw-rw-r-- 2 liping liping 153 Sep  5 18:15 hello.c      
   -rw-rw-r-- 2 liping liping 153 Sep  5 18:15 y.c      //硬链接文件和源文件所有属性都一样,只是多个名字

4、创建软链接 ln -s /home/peter/2308/linux/hello.c r.c

liping@ubuntu:~/2308/linux$ ls -l hello.c r.c
   -rw-rw-r-- 2 liping liping 153 Sep  5 18:15 hello.c
   lrwxrwxrwx 1 liping liping  30 Sep  5 23:28 r.c -> /home/peter/2308/linux/hello.c

iostat命令

第一次使用前需先安装

ab29b4c0da5841f2af711fd056549e1f.png

功能:查看CPU、磁盘的相关信息

语法:iostat -x[num 2]

选项:-x,显示更多信息

num1:数字,刷新间隔,num2:数字,刷新几次

591c81ed89ba4b83aff796660159b39b.png

使用iostat的-x选项,可以显示更多信息

357691bf96b9464ca08d58cb0ce69624.png

部分参数解析:

rkB/s:每秒发送到设备的读取请求数

wkB/s:每秒发送到设备的写入请求数

%util:磁盘利用率

sar命令

查看网络统计

语法:sar -n DEV num1 num2

选项:-n,查看网络,DEV表示查看网络接口

num1:刷新间隔,num2:查看次数(不填无数次数)

$符号

可以取出指定的环境变量的值

语法:$变量名

示例:

echo $PATH,输出PATH环境变量的值

echo ${PATH}ABC,输出PATH环境变量的值以及ABC

如果变量名和其它内容混淆在一起,可以使用${}

chmod命令

文件类型: 在linux中将一切都视为文件对待,但是文件分为7种类型,分别是:

(-)常规文件

(d)目录文件

(b)块设备

(c)字符设备

(p)管道

(s)套接字

(l)符号链接

文件权限:文件一般有三个权限:可读(r),可写(w),可执行(x)

文件权限用9个字符来标记,当有权限时,则为对应的字符,如果没有权限时,用-表示 9个标记位置要么有权限,要么没有权限,只有两种值,所以可以用二进制来表示文件权限, 比如有以下权限:

rw-rw-r-- 用二进制表示权限: 110110100

因为文件权限分三种用户:拥有者(u),所属组(g),其他用户(o),所有用户(a), 可以用8进制来表示不同用户的权限 所有上面的二进制权限,用八进制表示为: 110110100 -----> 0664

修改文件权限:chmod

例如: 第一种:用八进制整数表示文件权限

liping@ubuntu:~/2308/linux$ chmod 0775 1.txt
   liping@ubuntu:~/2308/linux$ ls -l
   total 20
   -rwxrwxr-x 1 liping liping  33 Sep  5 19:56 1.txt

第二种:用用户字符+权限字符来表示

liping@ubuntu:~/2308/linux$ chmod a+x 2.txt
   liping@ubuntu:~/2308/linux$ ls -l
   total 20
   -rwxrwxr-x 1 liping liping  33 Sep  5 19:56 1.txt
   -rwxrwxr-x 1 liping liping   0 Sep  4 20:35 2.txt

chown命令

修改文件、文件夹所属用户、组

语法:chown [-R] [用户][:][用户组] 文件或文件夹

选项,-R,同chmod,对文件夹内全部内容应用相同规制

选项,用户,修改所属用户

选项,用户组,修改所属用户组

:用于分隔用户和用户组

例如:

  liping@ubuntu:~/2308/linux$ sudo chown jack:liping 3.txt   //修改拥有者
   liping@ubuntu:~/2308/linux$ ls -l 3.txt
   -rw-rw-r-- 1 jack liping 0 Sep  4 20:35 3.txt

例如:

liping@ubuntu:~/2308/linux$ sudo chown jack:root 3.txt    //修改所属组
   liping@ubuntu:~/2308/linux$ ls -l 3.txt
   -rw-rw-r-- 1 jack root 0 Sep  4 20:35 3.txt

例如:同时修改拥有者和所属组

liping@ubuntu:~/2308/linux$ ls -l 3.txt
   -rw-rw-r-- 1 jack root 0 Sep  4 20:35 3.txt
   liping@ubuntu:~/2308/linux$ sudo chown liping:liping 3.txt   //同时修改拥有者和所属组
   liping@ubuntu:~/2308/linux$ ls -l 3.txt
   -rw-rw-r-- 1 liping liping 0 Sep  4 20:35 3.txt

ifconfig

查看ip

systemctl

功能:控制系统服务的启动关闭等

语法:systemctl start | stop | restart | disable | enable | status 服务名

  • start,启动

  • stop,停止

  • status,查看状态

  • disable,关闭开机自启

  • enable,开启开机自启

  • restart,重启

genent命令

  • getent group,查看系统全部的用户组

    7b1bb0f5c09847b29a894c56df629a84.png编辑

  • getenv passwd,查看系统全部的用户

    54145fdb00814e139d89f4198d246a22.png

env命令

查看系统全部的环境变量

语法:env

clear命令

功能:清屏,等同于ctrl + l

Linux进阶操作

软件安装

  • CentOS系统使用:

    • yum [install remove search] [-y] 软件名称

      • install 安装

      • remove 卸载

      • search 搜索

      • -y,自动确认

  • Ubuntu系统使用

    • apt [install remove search] [-y] 软件名称

      • install 安装

      • remove 卸载

      • search 搜索

      • -y,自动确认

yum 和 apt 均需要root权限

apt: 特点:

a, 自动在线查找,下载,安装软件包

b,在安装软件包时,可以自动检查软件包的依赖关系。

 用法: 
   Ubuntu采用集中式的软件仓库机制
     将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。
     然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。
     这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。
     因此,对于用户,这些镜像服务器就是他们的软件源(reposity)。 
 在linux中下载软件:
 1,指定软件源
   1》打开软件源配置文件
     sudo vim /etc/apt/sources.list
   2》在网上找到一个软件源,并复制到配置文件中,如下:
     \#  阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
         deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
         deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
         deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
         deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

2,更新软件源

peter@ubuntu:~$ sudo apt-get update

3,下载软件 ​ apt-get命令的子命令参考:1_软件包管理 ​ ​ 4,软件下载的保存位置 ​

peter@ubuntu:~$ ls /var/cache/apt/archives/
       lock                          ssh_1%3a7.6p1-4ubuntu0.7_all.deb
       ncurses-term_6.1-1ubuntu1.18.04.1_all.deb        ssh-import-id_5.7-0ubuntu1.1_all.deb
       net-tools_1.60+git20161116.90da8a0-1ubuntu1_amd64.deb  vim_2%3a8.0.1453-1ubuntu1.13_amd64.deb
       openssh-client_1%3a7.6p1-4ubuntu0.7_amd64.deb      vim-common_2%3a8.0.1453-1ubuntu1.13_all.deb
       openssh-server_1%3a7.6p1-4ubuntu0.7_amd64.deb      vim-runtime_2%3a8.0.1453-1ubuntu1.13_all.deb
       openssh-sftp-server_1%3a7.6p1-4ubuntu0.7_amd64.deb   vim-tiny_2%3a8.0.1453-1ubuntu1.13_amd64.deb
       partial
       peter@ubuntu:~$

日期

语法:date [-d] [+格式化字符串]

  • -d 按照给定的字符串显示日期,一般用于日期计算

  • 格式化字符串:通过特定的字符串标记,来控制显示的日期格式

    • %Y 年%y 年份后两位数字 (00..99)

    • %m 月份 (01..12)

    • %d 日 (01..31)

    • %H 小时 (00..23)

    • %M 分钟 (00..59)

    • %S 秒 (00..60)

    • %s 自 1970-01-01 00:00:00 UTC 到现在的秒数

示例:

  • 按照2022-01-01的格式显示日期

    e0a3c1d915f344109bdc21cd8d9d6505.png编辑

  • 按照2022-01-01 10:00:00的格式显示日期

    e3537a8a024348a78bd1a4eaff0a4b89.png编辑

  • -d选项日期计算

    31f5af7d0c8242ea9e1bdc359f42af63.png编辑

    • 支持的时间标记为:

      d30bcc858c0a4d3ca1071e1ef5793cb4.png编辑

时区

修改时区为中国时区

d871ce2b38412e9c3c55da07509b611d.png

ntp

功能:同步时间

安装:yum install -y ntp

启动管理:systemctl start | stop | restart | status | disable | enable ntpd

手动校准时间:ntpdate -u ntp.aliyun.com

主机名

功能:Linux系统的名称

查看:hostname

设置:hostnamectl set-hostname 主机名

CentOS配置VMware固定IP

  1. 修改VMware网络,参阅PPT,图太多

  2. 设置Linux内部固定IP

    修改文件:/etc/sysconfig/network-scripts/ifcfg-ens33

    示例文件内容:

    TYPE="Ethernet"
    PROXY_METHOD="none"
    BROWSER_ONLY="no"
    BOOTPROTO="static"          # 改为static,固定IP
    DEFROUTE="yes"
    IPV4_FAILURE_FATAL="no"
    IPV6INIT="yes"
    IPV6_AUTOCONF="yes"
    IPV6_DEFROUTE="yes"
    IPV6_FAILURE_FATAL="no"
    IPV6_ADDR_GEN_MODE="stable-privacy"
    NAME="ens33"
    UUID="1b0011cb-0d2e-4eaa-8a11-af7d50ebc876"
    DEVICE="ens33"
    ONBOOT="yes"
    IPADDR="192.168.88.131"     # IP地址,自己设置,要匹配网络范围
    NETMASK="255.255.255.0"     # 子网掩码,固定写法255.255.255.0
    GATEWAY="192.168.88.2"      # 网关,要和VMware中配置的一致
    DNS1="192.168.88.2"         # DNS1服务器,和网关一致即可

Ubuntu 配置固定ip

1,打开网络配置文件

sudo vim /etc/netplan/01-network-manager-all.yaml 

2,在上面打开的文件中,添加下面内容:

network:
   version: 2
   #renderer: NetworkManager       //注释掉该行
   ethernets:
          ens33:			//系统启动时自动启动该网卡
              dhcp4: no		//no:固定IP,true自动获取IP
              dhcp6: no		//no:固定IP,true自动获取IP
              addresses: [192.168.10.12/24]       //ubuntu的IP地址/子网掩码
              gateway4: 192.168.10.1		  //网关
              nameservers:
                      addresses: [202.96.128.86]     //配置DNS

3,重启网络服务

sudo netplan apply

4,查看IP地址

peter@ubuntu:~$ ifconfig 

5,测试网络是否配置Ok

peter@ubuntu:~$ ping www.baidu.com

用户组管理

以下操作需要超级用户权限

  1. 创建用户组

groupadd [用户组名]

      2. 删除用户组

groupdel [用户组名]

用户管理

1.用户属性文件

        /etc/passwd文件是系统能够识别的用户清单 用户登陆时,系统查询这个文件,确定用户的UID并验证用户口令 登陆名 经过加密的口令 UID 默认的GID 个人信息 主目录 登陆shell( /bin/bash )自动启动shell

        /etc/shadow文件是加密的用户清单 只有超级用户可以访问这个文件,用来保护加密口令的安全 登陆名 经过加密的口令 上次修改口令的时间 两次修改口令之间最少的天数 两次修改口令之间最多的天数 提前多少天警告用户口令即将过期 在口令过期之后多少天禁用账号 账号过期的日期 保留字段,目前为空

2.创建用户

useradd[-g -d]用户名

选项:-g指定用户的组,不指定-g,会创建同名组并自动加入,指定-g需要组已经存在,如已存在同名组,必须使用-g

           -d指定用户HOME路径,不指定,HOME目录默认在:/home/用户名

给rose用户添加sudo功能

打开文件/etc/sudoers ------> sudo vim /etc/sudoers

在文件中添加一行 ----> 21 rose ALL=(ALL:ALL) ALL

3.删除用户

userdel[-r] 用户名

选项:-r,删除用户的HOME目录。

要彻底删除一个用户,你需要执行以下步骤:

  1. 登录作为超级用户(root)或使用sudo权限。

  2. 确保你要删除的用户当前没有登录。

  3. 执行以下命令来删除用户的主目录:

    sudo rm -rf /home/用户名

    这将删除用户的主目录及其所有内容。

  4. 执行以下命令来删除用户的账户:

    sudo userdel -r 用户名

    这将从系统中删除用户及其相关文件和目录。

请注意,删除用户是一个敏感的操作,确保你知道自己在做什么,并且备份重要的用户数据。

4.查看用户所属组

id [用户名]

直接id默认查看自身

5.修改用户所属组

usermod -aG [用户组] [用户名]

将指定用户加入指定用户组

6.修改用户名

第一步:修改用户属性文件:/etc/passwd ,对应的用户名 打开/etc/passwd ----> sudo vim /etc/passwd 替换用户名 -------> :%s/rose/jack/g

第二步:修改用户属性文件:/etc/shadow ,对应的用户名 打开/etc/shadow ----> sudo vim /etc/shadow 替换用户名 -------> :%s/rose/jack/g

第三步:修改sudo文件:/etc/sudoers ,对应的用户名 打开/etc/shadow ----> sudo vim /etc/sudoers 替换用户名 -------> :%s/rose/jack/g

第四步:修改家目录-- /home/中对应的用户名

 peter@ubuntu:~$ cd /home/     //切换到home目录下
     peter@ubuntu:/home$ ls
     peter  rose
     peter@ubuntu:/home$ sudo mv rose/ jack   //修改rose为jack
     peter@ubuntu:/home$ ls
     jack  peter

linux服务配置

1,samba服务

----//将linux中的目录共享给Windows

1》安装samba服务

 sudo apt-get install samba samba-common

2》配置需要共享的目录 ​ 例如:将peter用户的主目录共享给Windows ​

第一步:打开samba的配置文件 ​

 sudo vim /etc/samba/smb.conf

第二步:在配置文件末尾添加下面内容: ​

 \#希望在Windows中看到共享目录的名字—自定义
       [peter]
       \#路径改为要共享的目录路径
       path = /home/peter/
       browseable = yes
       public = yes
       available = yes
       writable = yes
       \#给samba共享目录设置账号--ubuntu系统的用户名
       valid users = peter

第三步:给账号设置密码 ​

peter@farsight:~$ sudo smbpasswd -a peter
       New SMB password:
       Retype new SMB password:
       Added user peter.

3》重启samba服务

peter@farsight:~$ sudo /etc/init.d/smbd restart
     [ ok ] Restarting smbd (via systemctl): smbd.service.

4》测试: 在Windows中访问共享目录

 win+r  --->输入linuxIP: \\192.168.10.5

2,TFTP服务

--------//在linux中提供文件下载服务

1》安装tftp服务

 sudo apt-get install tftp-hpa tftpd-hpa

2》创建tftp的工作(下载)目录

  sudo mkdir /tftpboot
     sudo chmod 0777 /tftpboot/

3》将创建的工作目录配置到tftp服务中 第一步:打开配置文件

 sudo vim  /etc/default/tftpd-hpa

第二步:修改工作目录 ​

\# /etc/default/tftpd-hpa
       TFTP_USERNAME="tftp"
       TFTP_DIRECTORY="/tftpboot"       //修改TFTP_DIRECTORY的值为我们自己创建的工作目录的路径
       TFTP_ADDRESS=":69"
       TFTP_OPTIONS="--secure"

4》重启tftp服务

 sudo /etc/init.d/tftpd-hpa restart   或 sudo service tftpd-hpa restart

5》测试: 第一步:向工作目录拷贝一个文件

cp /etc/vim/vimrc /tftpboot/

第二步:在用户的主目录中,登录tftp服务器 ​

peter@farsight:~$ tftp 192.168.10.5
       tftp> get vimrc           //第三步:通过get命令,下载文件vimrc
       tftp> quit

第四步:检查文件,如果文件vimrc不为空,说明下载成功 ​

peter@farsight:~$ ls -lh vimrc
       -rw-rw-r-- 1 peter peter 2.5K Sep  6 01:43 vimrc

3,NFS服务

----//提供网络文件系统,给客户端主机远程挂载文件系统

1》安装NFS服务

 sudo apt-get install nfs-kernel-server

2》将提前做好的文件系统rootfs.tar.gz拷贝到 ubuntu的 /opt ,并解压

 peter@farsight:/opt$ tar -xvf rootfs.tar.gz

3》在NFS服务器中配置文件系统的路径 第一步:打开nfs配置文件

 sudo vim /etc/exports

第二步:在文件末尾添加下面一行 ​

 /opt/rootfs/  *(rw,sync,no_root_squash,no_subtree_check)//Sync 资料同步写入到内存与硬盘中 
                                   //no_root_squash 如果共享/usr/bin之类的子目录时,不检查父目录的权限 
                                  //no_subtree_check 客户机用root访问该共享文件夹时,不映射root用户

4》重启nfs服务

peter@farsight:/opt$ sudo /etc/init.d/nfs-kernel-server restart
     [ ok ] Restarting nfs-kernel-server (via systemctl): nfs-kernel-server.service.

5》测试 第一步:在用户主目录下创建一个挂载点

  peter@farsight:~$ mkdir mnt

第二步:将网络文件系统挂载到上面创建的挂载点 ​

 peter@farsight:~$ sudo mount 192.168.10.5:/opt/rootfs  ./mnt
       peter@farsight:~$ ls mnt/     //查看挂载点中有没有文件,如果有,说明挂载成功了
       arm_drv  dev  etc  home  lib    mjpg  opt  proc  sbin  tmp  www
       bin    docs  go  ko   linuxrc  mnt  pice  root  sys  usr  xx.jpg

开发板中启动linux

一,将开发板各种线连接好 

二,打开mobaxterm ,通过串口连接开发板

三,将内核镜像拷贝到ubuntu的/tftpboot中 \192.168.10.5\tftpboot zImage

四,将文件系统:filesystem.tar.gz 拷贝到/opt ,并用tar命令解压

 peter@ubuntu:/opt$ tar -xvf filesystem.tar.gz

五,将文件系统配置到nfs服务中

1》打开nfs配置文件

sudo vim /etc/exports

2》在文件末尾添加下面一行

  /opt/filesystem/  *(rw,sync,no_root_squash,no_subtree_check)

3》重启nfs服务

peter@ubuntu:/opt$ sudo /etc/init.d/nfs-kernel-server restart
     [ ok ] Restarting nfs-kernel-server (via systemctl): nfs-kernel-server.service.

六,使用mobaxterm配置uboot参数 1.1 x为ubuntu的IP地址[用ifconfig可以获取],设置tftp服务端的ip地址 set serverip 192.168.10.x

1.2 板子ip地址设置(注意,这里的y是由ubuntu的ip地址x+60计算而来,每个人是不同的) set ipaddr 192.168.10.y

1.3 网关设置 set gatewayip 192.168.10.1

1.4 设置MAC地址(N为用户座位编号,如果N<10,请前面加0,比如6号N就为06,11号N为11) setenv ethaddr 11:22:33:44:55:N

1.5 内核镜像下载命令配置 set bootcmd tftp 20800000 zImage\;bootm 20800000

1.6 内核参数配置 set bootargs root=nfs nfsroot=192.168.10.x:/opt/filesystem ip=192.168.10.y init=/linuxrc console=ttySAC0,115200

1.7 保存配置信息 save

例如:

SMDKC100 # set serverip 192.168.10.5

SMDKC100 # set ipaddr 192.168.10.7

SMDKC100 # set gatewayip 192.168.10.1

SMDKC100 # setenv ethaddr 11:22:33:44:55:e2

SMDKC100 # set bootcmd tftp 20800000 zImage\;bootm 20800000

SMDKC100 # set bootargs root=nfs nfsroot=192.168.10.5:/opt/filesystem ip=192.168.10.7 init=/linuxrc console=ttySAC0,115200

SMDKC100 # save

七,重启开发板,观察运行结果

//出现下面的问题:

TCP cubic registered NET: Registered protocol family 17 s3c-rtc s3c64xx-rtc: hctosys: invalid date/time eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1 IP-Config: Guessing netmask 255.255.255.0 IP-Config: Complete: device=eth0, addr=192.168.10.7, mask=255.255.255.0, gw=255.255.255.255, host=192.168.10.7, domain=, nis-domain=(none), bootserver=255.255.255.255, rootserver=192.168.10.5, rootpath= Looking up port of RPC 100003/2 on 192.168.10.5 Looking up port of RPC 100005/1 on 192.168.10.5 VFS: Unable to mount root fs via NFS, trying floppy. VFS: Cannot open root device "nfs" or unknown-block(2,0) Please append a correct "root=" boot option; here are the available partitions: 1f00 1024 mtdblock0 (driver?) 1f01 3072 mtdblock1 (driver?) 1f02 12288 mtdblock2 (driver?) 1f03 245760 mtdblock3 (driver?) Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0) [<c002f22c>] (unwind_backtrace+0x0/0xf0) from [<c02e27c8>] (panic+0x54/0xd0) [<c02e27c8>] (panic+0x54/0xd0) from [<c0009018>] (mount_block_root+0x1c8/0x208) [<c0009018>] (mount_block_root+0x1c8/0x208) from [<c00092a8>] (prepare_namespace+0x160/0x1b8) [<c00092a8>] (prepare_namespace+0x160/0x1b8) from [<c00085ec>] (kernel_init+0x110/0x150) [<c00085ec>] (kernel_init+0x110/0x150) from [<c002ae20>] (kernel_thread_exit+0x0/0x8)

//解决方法: 设置nfs兼容v2,v3版本(使能NFS V2版本)

第一步:打开下面的文件 sudo vim /etc/default/nfs-kernel-server

第二步:在文件末尾添加下面一行 RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"

第三步:重启nfs服务 sudo /etc/init.d/nfs-kernel-server restart 重启开发板:

***welecome!*****

/bin/sh: can't access tty; job control turned off

/ #

//如上面显示,能进入linux命令行,说明linxu系统启动成功

八,在开发板中的linux系统中运行mp3播放器

1,将mp3播放器和想听的歌曲拷贝到文件系统 /opt/filesystem/ madplayer ---拷贝到 : /opt/filesystem/

2,在开发板(串口调试界面)中,运行mp3

/ # cd madplayer/ //进入madplayer目录 /madplayer # ls hurd.mp3 madplay nobody.mp3 /madplayer # ./madplay hurd.mp3 //运行madplay 传递要播放的歌曲

ubuntu使用小技巧

1、finalshell无法连接ubuntu

由于没有安装openssha-server

1.安装sshQ sudo apt-get install openssh-server

2.重启 ssh服务Q sudo service ssh restart

3.查看启动情况 ps -e lgrep ssh 检查防火墙是否关闭 (关闭防火墙)

4.查看防火墙是否关闭 sudo ufw status

5.关闭防火墙 sudo ufw disable

6.启动22端门 sudo ufw allow 22

2.虚拟机中Ubuntu终端缩小字体(Ctrl) + ( - )

放大字体(Ctrl) + (Shift) + ( + )

3.vim文件对齐

1.在命令模式下按V键进入可视模式

2.选中需要对齐的语句

3。按一下键盘上的“+/=”

4.多文档编辑

vim 文档1 文档2 ... -p

5.保存并退出

:wq或:x

6.安装中文版man手册

1、下载安装

sudo apt-get install manpages-zh

2、修改配置文件

vi ~/.bashrc

然后在 ~/.bashrc 文件最后添加:

alias can='man -M /usr/share/man/zh_CN'

保存并关闭

3、source ~/.bashrc使修改生效

然后就可以使用can命令来查看中文手册啦

img编辑

img

7.编译c文件

gcc hello.c -o hello

make hello

上面这两个命令是等效的。

8.编译的同时打印出隐含警告

格式:gcc [文件名] -Wall

Make工程管理器


在软件开发过程中,项目管理是一个不可忽视的环节。一个良好的项目管理工具可以帮助开发者提高效率、减少工作量,而Makefile作为一种常用的项目管理工具,可以帮助我们更好地组织和管理工程。

一、什么是Makefile


Makefile是一个文本文件,用于告诉make命令如何构建和管理项目。它包含了一系列的规则,每个规则定义了一个或多个目标文件、依赖文件和相应的命令。当我们运行make命令时,它会根据Makefile中的规则来判断哪些文件需要更新,然后执行相应的命令进行构建。

二、基本规则

首先,我们来写一个在命令终端上输出“Hello World”的简单Makefile。文件的存放目录任意。文件名为makefile(m也可以大写)

all:
    echo "hello world"

echo前必须只有Tab,且至少有一个Tab,不能用空格代替。

all:目标,目标放在“:”的前面,其名字可以是由字母和下划线(_)组成的字符串。

echo “hello world” :生成目标的命令。

上面其实是定义了如何生成all 目标,也称之为规则。

查看运行结果:

第一种方式:只要在makefile所在目录下运行make命令,就会在终端上输出二行,第一行实际是在makefile中所写的命令,而第二行是运行命令的结果

liping@ubuntu:~/Makefile$ make
echo "hello world"
hello world

第二种方式:是运行“make all”命令,这告诉make工具,需要生成目标all,结果跟上面一样。

接下来,对上述makefile做出一点点小改动,如下:

all:
    echo "hello world"
test:
    echo "It is my test example"

然后运行make test,指示make生成test目标。结果可想而知:

liping@ubuntu:~/Makefile$ make test
echo "It is my test example"
It is my test example

因此

(1)一个makefile中可以定义多个目标

(2)调用make命令时,如果没有指明目标是什么,那么make以makefile文件中定义的第一个目标作为这次运行的目标。

(3)当make得到目标后,先找到定义目标的规制,然后运行规制中的命令来达到构建目标的目的。上述例子中,每一个规制中只有一条命令,而实际上每一个规制可以包含很多条命令。

如果要使make不打印出命令,就在命令前加一个@符号。 

all:
    @echo "hello world"
test:
    @echo "It is my test example"

 运行结果:

liping@ubuntu:~/Makefile$ make test
It is my test example

如果在“all :”后面加上test。我们会发现运行make时,test目标也被构建了。

all:test
    @echo "hello world"
test:
    @echo "It is my test example"
liping@ubuntu:~/Makefile$ make
hello world
It is my test example

all目标后面的test是告诉make,all目标依赖test目标,这一依赖目标在makefile中又被称为先决条件。make工具会按照从左到右的顺序先构建规则中所依赖的每一个目标。

 在Makefile中,每个规则由以下几部分组成:
   - 目标:规定了要生成的文件名。 
   - 依赖目标/先决条件:规定了目标文件所依赖的文件。
   - 命令:规定了如何生成目标文件的命令。

下面,我们来写一个用于创建simple可执行程序的makefile

simple:main.o foo.o bar.o
    gcc -o simple main.o foo.o bar.o
main.o:main.c
    gcc -c main.c -o main.o
foo.o:foo.c
    gcc -c foo.c -o foo.o
bar.o:bar.c
    gcc -c bar.c -o bar.o

在编译时需要清除所生成的文件,这时就可以添加clean目标来删除所生成的文件

simple:main.o foo.o bar.o
    gcc -o simple main.o foo.o bar.o
main.o:main.c
    gcc -c main.c -o main.o
foo.o:foo.c
    gcc -c foo.c -o foo.o
bar.o:bar.c
    gcc -c bar.c -o bar.o
clean:
    rm *.o

三、假目标

现在假设程序所在目录下有一个clean文件,运行make clean命令,会发现make总是提示clean文件是最新的,而不是按我们期望的那样进行文件删除操作。

对于这种情况,makefile中的假目标可以解决这个问题

假目标采用.PHONY关键字来定义

采用.PHONY关键字声明一个目标后,make并不会将其当作一个文件来处理,而是当作一个概念上的目标。对于假目标,我们可以想象的是由于并不与文件关联。

四、makefile变量

 格式:变量名=期望的值

变量的引用:$(变量名)/${变量名}

.PHONY:clean
CC = gcc
RM = rm
OBJ = simple
OBJS = main.o foo.o bar.o

$(OBJ):$(OBJS)
    $(CC) -o $(OBJ) $(OBJS)
main.o:main.c
    $(CC) -c main.c -o main.o
foo.o:foo.c
    $(CC) -c foo.c -o foo.o
bar.o:bar.c
    $(CC) -c bar.c -o bar.o
clean:
    @$(RM) $(OBJS) $(OBJ) 

显然,变量的引用增加了makefile的可维护性

1>自动变量

前言:目标和先决条件的名字会在规则的命令中多次出现。如果改变了目标或者是依赖的名,那得在命令中全部跟着改。这是需要用到自动变量:

  • $@用于表示一个规则中的目标。
  • $^表示规则中的所有选择条件。
  • $<表示规则中的第一个先决条件。
.PHONY:clean
CC = gcc
RM = rm
OBJ = simple
OBJS = main.o foo.o bar.o

$(OBJ):$(OBJS)
    $(CC) -o $@ $^
main.o:main.c
    $(CC) -c $^ -o $@
foo.o:foo.c
    $(CC) -c $^ -o $@
bar.o:bar.c
    $(CC) -c $^ -o $@
clean:
    @$(RM) $(OBJS) $(OBJ) 

makefile中“$”具有特殊含义,如果想要采用echo输出“$”,则必须用两个连着的“$”。

2>预定义变量

略。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
嵌入式Linux架构是指将Linux操作系统应用于嵌入式设备的一种系统架构。嵌入式设备是指那些在特定功能下运行的小型电子设备,如智能手机、家电、车载系统等。嵌入式Linux架构经过特殊的定制和优化,使其适应嵌入式设备的资源限制和实时性需求。 嵌入式Linux架构主要包括以下几个要素: 1. 内核(Kernel):嵌入式Linux使用定制的内核,可以根据设备的需求进行精简和优化,减少内存和处理器的占用。嵌入式设备通常需要实现快速启动和实时响应,因此内核需要有较高的性能和稳定性。 2. 文件系统(File System):嵌入式Linux使用定制的文件系统,一般采用轻量级的文件系统,如YAFFS、JFFS2等。这些文件系统具有高效的读写速度和可靠的数据存储,适用于嵌入式设备的特殊需求。 3. 驱动程序(Device Drivers):嵌入式Linux需要针对设备硬件编写相应的驱动程序,以实现设备与操作系统的交互。嵌入式设备通常需要集成多种不同的硬件设备,因此驱动程序的开发非常重要。 4. 应用程序(Applications):嵌入式Linux支持各种应用程序的运行,如网络应用、多媒体应用、图形界面应用等。开发者可以根据需要定制和开发自己的应用程序,使嵌入式设备具备更强的功能和更好的用户体验。 嵌入式Linux架构具有灵活性、稳定性和可靠性等优点,可以为嵌入式设备提供强大的操作系统支持。同时,嵌入式Linux的开源性和庞大的开发者社区也为开发者提供了大量的资源和技术支持,使得嵌入式Linux架构成为目前广泛应用于各种嵌入式设备的首选系统架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值