嵌入式c语言高级编程(1)

文章目录

  • 嵌入式c语言高级编程(1)
  • 前言
  • 一、软件包管理及shell命令
    • 1.liunx与Unix的区别
    • 2.软件包管理器
  • 二、shell命令
    • 1.常见shell命令使用
    • 2.liunx文件系统
    • 3.绝对路径和相对路径
    • 3.Linux文件系统和Windows文件系统的区别
    • 3.文件的压缩和解压
    • 4.网络配置
  • 总结

嵌入式c语言高级编程(1)


前言

提示:学习嵌入式,C语言是最重要的基础,在c语言基础之上我们还需要对liunx下c语言编程有一点了解。学习常见的几种软件包的管理和使用,常见的shell命令以及shell脚本的编程,同时深入熟悉使用Makefile编程。


一、软件包管理及shell命令

1.liunx与Unix的区别

1.开源性
Linux是一款开源操作系统,不需要付费,即可使用; Unix是一款对源码实行知识产权保护的传统商业软件,使用需要付费授权使用。
2.跨平台性
Linux操作系统具有良好的跨平台性能,可运行在多种硬件平台上; Unix操作系统跨平台性能较弱,大多需与硬件配套使用。
3.可视化界面
Linux除了进行命令行操作,还有窗体管理系统; Unix只是命令行下的系统。
4.硬件环境
Linux操作系统对硬件的要求较低,安装方法更易掌握; Unix对硬件要求比较苛刻,按照难度较大。
5.用户群体
Linux的用户群体很广泛,个人和企业均可使用; Unix的用户群体比较窄,多是安全性要求高的大型企业使用,如银行、电信部门等,或者Unix硬件厂商使用,如Sun等。相比于Unix操作系统, Linux操作系统更受广大计算机爱好者的喜爱,主要原因是Linux操作系统具有Unix操作系统的全部功能,并且能够在普通PC计算机上实现全部的Unix特性,开源免费的特性,更容易普及使用!

2.软件包管理器

目前的linux系统大致分为两类:
RedHat 系列:Redhat、Centos、Fedora 等,使用rpm;
Debian 系列:Debian、Ubuntu 等,使用dpkg。
由于自由软件的蓬勃发展,怎么管理越来越多的软件对于linux系统来说非常关键。
1. dpkg
dpkg(package manager for Debian,debian系统的包管理工具)。dpkg是Debian的一个底层包管理工具,主要用于对已下载到本地和已安装的软件包进行管理。dpkg这个机制最早由Debian Linux社区所开发出来的,通过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时能提供安装后的软件信息。
使用dpkg -i xxx.deb或dpkg --install xxx.deb指令来安装.deb软件包。

2. rpm
rpm(RedHat Package Manager,RedHat系统的包管理工具)。这个机制最早由Red Hat这家公司开发出来的,后来实在很好用,因此很多distributons就使用这个机制来作为软件安装的管理方式,包括Fedora,CentOS,SuSE等知名的开发商都是用它。
使用rpm -i xxx.rpm或rpm --install xxx.rpm指令来安装.rpm软件包。

但是dpkg和rpm不能很方便地处理包的依赖关系,那么怎么实时通过网络查询依赖关系进行安装呢,在dpkg和rpm的基础上分别开发出了apt-get和yum(Red Hat)这种『线上升级』机制。

distribution 代表 体管理机制 使用指令 线上升级机制(指令)
Red Hat/Fedora RPM rpm, rpmbuild YUM (yum)
Debian/Ubuntu DPKG dpkg APT (apt-get)

3. apt
由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。为了能够有选择地访问,在Ubuntu系统中,使用软件源配置文件/etc/apt/sources.list列出最合适访问的镜像站点地址。
apt可以看作apt-get 和 apt-cache 命令的子集, 可以为包管理提供必要的命令选项。
apt-get 虽然没被弃用,但作为普通用户,还是应该首先使用 apt。
使用apt-get install或apt install安装后,软件的目录:

下载的软件的存放位置:/var/cache/apt/archives
安装后软件的默认位置:/usr/share
可执行文件位置:/usr/bin
配置文件位置:/etc
lib文件位置:/usr/lib
4. yum
YUM可以看作是CS架构的软件,YUM的存在很好的解决了RPM的属性依赖问题。YUM通过依赖rpm软件包管理器, 实现了rpm软件包管理器在功能上的扩展, 因此YUM是不能脱离rpm而独立运行的。
/etc/yum.repos.d/里面会有多个配置文件(文件名以.repo结尾),yum会从里面逐个查找,所以里面的容器名称不能有重复。

原文链接:https://blog.csdn.net/qq_23599965/article/details/90518788

二、shell命令

1.常见shell命令使用

关机重启(showdown),历史记录(history),文件通配符(* ? []三种用法}),管道(| grep),进程显示(ps,top kill),输入输出重定向(> >> <),cat,echo,man,password,用户名用户组(group user)

关机命令:

1、halt 立刻关机 2、poweroff 立刻关机 3、shutdown -h now 立刻关机(root用户使用) 4、shutdown -h 10 10分钟后自动关机 如果是通过shutdown命令设置关机的话,可以用shutdown -c命令取消重启

重启命令

1、reboot 2、shutdown -r now 立刻重启(root用户使用) 3、shutdown -r 10 过10分钟自动重启(root用户使用) 4、shutdown -r 20:35 在时间为20:35时候重启(root用户使用) 如果是通过shutdown命令设置重启的话,可以用shutdown -c命令取消重启

历史命令

1.可以按一下上\下方向键,命令行就会显示相对于当前命令的上一条或下一条历史记录.

2.和方向键相同功能的就是组合键Ctrl+ p (前面执行过的命令),Ctrl +n(后面执行过的命令).

3.上面两个都是相对于当前命令查询上一条或者下一条命令的历史记录.如果搜索命令历史记录,

就用Ctrl+ r 组合键进入历史记录搜寻状态,然后,键盘每按一个字母,当前命令行就会搜索出命令历史记录.

4 .echo $HISTSIZE 显示历史容量

5 .linux下修改history最大保留数,直接修改配置参数命令为:vi /etc/profile修改其中”HISTSIZE=1000”参数值即可。但是重启服务器后,又还原了,如果想一直保留修改的参数值(999),我们需要修改他的环境变量;命令如下

sed -i ‘s/HISTSIZE=1000/HISTSIZE=999/g’/etc/profile

source /etc/profile (使其生效即可)

6.常见文件通配符

file_*.txt * 指的是匹配任意长度的
file_?.txt ? 匹配的是一个字符长度的
file_[abc].txt 匹配括号里面的字符
file_[a-n].txt 匹配括号里面的字符范围
file_[^abc].txt 匹配除了括号里面的字符

7.管道和grep的使用
在 Linux 中,PIPE能让你将一个命令的输出发送给另一个命令。
管道,如它的名称那样,能重定向一个进程的标准输出、输入和错误到另一个进程,以便于进一步处理,语法是在两个命令之间加上 字符“|”。

command | grep *
command命令的输出通过grep过滤我们想要的*
grep “*” where
在where里面过滤我们想要的 *

8.输入输出重定向
重定向就是指将流重新分配至文件,或者将文件中的内容输出流。

输入重定向 stream >file stream 中的内容流入file 中
输入重定向内容追加stream >>file stream中的内容追加到file中的内容去
f输出重定向 stream file中的内容输出到stream 中去

9.cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的;
cat主要有三大功能:
1.一次显示整个文件内容。
cat filename
2.从键盘创建一个文件,在下面输入文件的内容 Ctrl+c结束。
cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件。
$cat file1 file2 > file

10.echo命令用法
1,覆盖型写法 (文件里原来的内容被覆盖)
echo “aaa” > a.txt
echo aaa > a.txt

2,添加型写法 (新内容添加在原来内容的后面)

echo “aaa” >> a.txt
echo aaa >> a.txt

3,显示内容
echo $PATH 变量
echo $(command) 命令
echo “command” 注意“”应该是·单引号在esc下面,只是文章打不出来

11.man的用法

嵌入式c语言高级编程(1)_第1张图片

man 1 查看bash下命令的使用说明

man 2 查看系统调用函数的使用说明 man open

man 3 查看库函数的使用说明

12.用户和用户组
1.linux下创建用户
日常运维我们使用useradd命令来创建用户,常用的命令如下:
不加任何参数,仅创建用户
示例:useradd myuser

    此时用户的家目录是/home/myuser

-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
示例:useradd -d /opt/myuser -m myuser

-g 用户组 指定用户所属的用户组。
我们创建用户的时候会默认创建一个和用户名相同的用户组,但是有时有需求需要指定用户组,可以使用-g命令来完成用户创建,前提条件是指定的用户组已存在

    示例:useradd -g mygroup myuser
  1. linux下设置用户密码
    2.1. 基本命令
    linux下设置用户的密码需要使用passwd命令

root用户修改或设置普通用户密码命令:
方法一:passwd 普通用户名

        示例:passwd myuser

        会提示你输入密码,并且需要做一次确认密码的重试输入

        如果输入密码后提示:Password has been already used. Choose another.则说明设置的密码之前使用过,执行echo "" > /etc/security/opasswd后重试即可

    方法二:echo "密码"| passwd 用户名 --stdin

        示例:echo "Puluo@123"| passwd myuser --stdin

        这个时候需要使用passwd myuser命令来修改密码,如果输入密码后提示:Password has been already used. Choose another.则说明设置的密码之前使用过,执行echo "" > /etc/security/opasswd后重试即可

普通用户或root用户修改自己的密码
输入passwd命令后按回车键后输入两次密码即可。

2.2. passwd常用参数
-l 锁定口令,即禁用账号。
示例:passwd -l myuser

      执行完成后再登录myuser用户输入之前的密码后会提示Access denied

      有时候我们发现机器账号异常登录可以先执行这个命令将用户锁死

-u 解锁用户。
示例:passwd -u myuser

-d 使账号无需密码即可登录。
示例:passwd -d myuser

      这个我尝试执行后发现在登录的时候仍然提示我需要输入密码,但是使用其他普通用户切换到这个用户时可以不输入密码
  1. linux下添加用户组
    groupadd 用户组名称

    示例:groupadd mygroup

  2. linux下修改用户信息
    有时我们需要修改用户的用户组,家目录等信息,这时候使用useradd命令显然就不合适了,linux系统为我们提供了usermod命令,常用的参数与useradd一样大家可自行尝试。

  3. linux删除用户
    删除用户使用命令userdel,示例:userdel myuser,使用这个命令的话只会删除用户,用户的主目录不会被删除,如果需要删除用户的时候也将用户主目录删除则可以使用-r,示例:userdel -r myuser

  4. linux删除用户组
    删除用户组使用命令groupdel,示例:groupdel mygroup,注意,被删除的用户组不可以是任何用户的主用户组,否则删除失败。用户组删除完成后可以到/etc/group文件中去查看被删除则用户组名称已经不存在了。

  5. Shell脚本创建用户
    利用shell脚本编程实现用户的创建,自己可以动手操作一下,代码在下面链接

原文链接:https://blog.csdn.net/u011294519/article/details/89174272

13.进程命令

进程是在 CPU 及内存中运行的程序代码,而每个进程可以创建一个或多个进程(父子进程)。
ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
ps aux命令
a:显示当前终端下的所有进程信息,包括其他用户的进程。

u:使用以用户为主的格式输出进程信息。

x:显示当前用户在所有终端下的进程。
嵌入式c语言高级编程(1)_第2张图片

USER:启动该进程的用户账号名称
PID:该进程的ID号,在当前系统中是唯一的
%CPU:CPU占用的百分比
%MEM:内存占用的百分比
VSZ:占用虚拟内存(swap空间)的大小
RSS:占用常驻内存(物理内存)的大小
TTY:该进程在哪个终端上运行。“?”表未知或不需要终端
STAT:显示了进程当前的状态,如S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)。对处于僵死状态的进程应予以手动终止。
START:启动该进程的时间
TIME:该进程占用CPU时间
COMMAND:启动该进程的命令的名称
总结:ps aux 是以简单列表的形式显示出进程信息
ps kill -15 PID 杀死PID进程号的进程
ps -18 PID 恢复进程号为PID的进程

ps elf命令

-e:显示系统内的所有进程信息。

-l:使用长(long)格式显示进程信息。

-f:使用完整的(full)格式显示进程信息。
在这里插入图片描述

PPID是父进程的PID
引申一下PPID和PID的区别与关系:

UID是用户ID,PID是进程ID,PPID是父进程ID

top命令
以全屏交互式的界面显示进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每三秒刷新一次,其作用基本类似于Windows系统中的任务管理器。动态的刷新
嵌入式c语言高级编程(1)_第3张图片

Tasks(系统任务)信息:total,总进程数;running,正在运行的进程数;sleeping,休眠的进程数;stopped,中止的进程数;zombie,僵死无响应的进程数。

CPU信息:us,用户占用;

sy,内核占用;

ni,优先级调度占用;

id,空闲CPU;

wa,I/O等待占用;

hi,硬件中断占用;

si,软件中断占用;

st,虚拟化占用。了解空闲的CPU百分比,主要看%id部分。

Mem(内存)信息:total,总内存空间;

used,已用内存;

free,空闲内存;

buffers,缓存区域。

Swap(交换空间)信息:

total,总交换空间;

used,已用交换空间;

free,空闲交换空间;

cached,缓存空间。

pstree aup命令
以树状图的方式展现进程之间的派生关系,显示效果比较直观。
嵌入式c语言高级编程(1)_第4张图片

-a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示;
-c:不使用精简标示法;
-G:使用VT100终端机的列绘图字符;
-h:列出树状图时,特别标明现在执行的程序;
-H<程序识别码>:此参数的效果和指定"-h"参数类似,但特别标明指定的程序;
-l:采用长列格式显示树状图;
-n:用程序识别码排序。预设是以程序名称来排序;
-p:显示程序识别码;
-u:显示用户名称;
————————————————

原文链接:https://blog.csdn.net/lzf_hlh/article/details/108586184

mkdir目录命令

file [filename] 显示文件名称为filename的文件类型
mkdir [directory name]创建一级目录
mkdir -p 【directory name】创建多级目录 mkdir -p d1/d2/d3
rmdir -p d1/d2/d3 目录下的删除先要把目录下面的内容删除
rm -r d1 可以直接删除内容

2.liunx文件系统

详细请看这位博主的深度解析
https://blog.csdn.net/github_37882837/article/details/90672881?ops_request_misc=%257B%2522request%255Fid%2522%253A%

3.绝对路径和相对路径

1,什么是路径:你要去哪的路线嘛。如果你想要去哪个目录或者是去找哪个目录里的文件,那就用路径来找到了。注意:目录本身也是文件

2,在Linux中使用.来表示当前目录,使用…来表示上一级目录。-表示上次所在目录,~表示当前用户的“home”目录。使用命令pwd可以获得当前所在路径。注意是绝对路径。

3,绝对路径就是以根“/”目录为起点,以你所到达的目录为终点,表现形式为/usr/local/bin。

4,相对路径是以你当前的目录的路径。相对路径是以你当前的.目录为起点,以你到达的目录为终点的路径。比如:usr/local/bin这里假设当前目录为根目录。注意:表示相对路径时我们并没有加上表示当前目录的那个.,而是直接以目录名usr开头,因为这个usr目录是在根目录“/”下,可以省略那个.。

硬链接和软链接

对于linux有一定了解的朋友都知道linux里面有一个重要的概念叫做i结点,即inode。

如果有人问你,一个系统里面可以存放多少文件?你会怎么回答?

其实,在这里,我觉得用剩余i结点的个数更准确。因为我们知道,在linux系统中,任何一个独立(注意:这里强调是独立的文件)的文件,都会为其分配一个i结点,它们是对应的,然后通过i结点再找到相应的文件的实际存储内容。

硬链接 软链接
索引节点号 硬链接文件和源文件指向相同的 软链接文件和源文件指向不同的索引节点号
文件属性 硬链接没有任何标识,因为硬链接文件和源文件是相对独立的 软链接在Linux中进行了明确的标识
对目录进行链 不支持 支持
跨文件链接 不支持 支持
对不存在的文件进行链接 不支持,硬链接要求文件必须存在(即inode必须存在) 支持,软链接可以对一个不存在的文件名链接,当使用vim对软链接文件进行编辑的时候,Linux 会自动新建-个文件名为flename
创建方式 ln block.txt block_hd #建立硬链接(in 链接的文件 链接的路径) i ln -s block.txt block_soft #建立软链接(软链接要使用绝对路径)
用处 保存,当删除其他的文件时对应的链接文件没有删除,且不影响。对配置环境变量的时候要加入路径我们也可以直接链接路径就行但是大部分使用的是软链接使用的是绝对路径 类似Windows下的快捷方式, 对配置环境变量的时候要加入路径我们也可以直接链接路径就行

3.Linux文件系统和Windows文件系统的区别

liunx文件系统 Windows文件系统
文件命令 区分大小写。而linux无扩展名的概念,当然为了管理员区分方便会有部分扩展, 例如.gz , .bz2 ,.tar.bz2代表压缩包,.html ,.php代表网页文件,这些纯粹是给管理员看的便于区分,但是linux本身是没有扩展名的,linux是以权限区分文件 windows在dos界面命令下不区分大小写。windows用扩展名区分文件如.exe代表执行文件,.txt代表文本文件
存储结构 在 Linux 下,我们是看不到这些驱动器盘符,我们看到的是文件夹(目录):linux没有盘符这个概念,只有一个根目录 /,所有文件都在它下面 驱动器盘符结构,在每个盘符下面再分根目录结构
路径分隔符 / home /名称/ C:\ Users \ Name
文件格式 主要的文件格式有EXT2 ,EXT3,Vfat等 FAT ,NTFS格式
与硬盘分区关系 分区在目录结构中, 目录结构在分区中
文件与目录的权限 多用户使用的操作系统,因而对所有文件和目录有相应的访问权限 定位为单用户的操作系统 ,开始没有文件权限的概念,后来增加了这方面功能

3.文件的压缩和解压

目前压缩和解压的工具很多,根据不同的文件后缀扩展名,才有不同的方法。网上有很多种。下面我讲的是liunx下常用的工具tar
tar功能:文件压缩解压

-c 建立一个压缩文件的参数指令(create)–压缩

-x 解开一个压缩文件的参数指令(extract)–解压
-v 压缩的过程中显示文件(verbose)

-f 使用档名,在f之后要立即接档名(file)

-z 是否需要用gzip压缩

-j 是否需要用bz压缩

常用解压参数组合:zxvf jxvf

常用压缩参数组合:zcvf jcvf

如果不能使用可能是命令顺序排序问题

.gz .bz .tar
压缩 tar -cvzf filename.tar.gz filename tar -cvjf filename.tar.gz filename tar -cvf filename.tar filename
解压 tar -xvzf filename.tar.gz tar -xvjf filename.tar.bz tar -xvf filename.tar

4.网络配置

ip网络共五类ABCDE,其中D类ip用作组播,实际上只有三类可以用
A类:0.0.0.0-127.255.255.255
其中0.xxx.xxx.xxx不可以使用
127.xxx.xxx.xxx用作本地环回测试用的
A类可以使用的是1.0.0.0-126.255.255.255
B类:128.0.0.0-191.255.255.255
C类 :192.0.0.0-223.255.255.255
D类:224.0.0.0-239.255.255.255 用于组播和科研
E类:240.0.0.0-255.255.255.255
D类和E类为保留地址段,不可以分配

ping ip地址 ping 192.168.1.131

nslookup 域名 获取ip地址 nslookup www.baidu.com

ifconfig可以查询网络配置信息和配置网络的状态
查询网络配置信息 ifconfig
嵌入式c语言高级编程(1)_第5张图片
(lo表示本地回环网卡的信息)

使用ifconfig命令还可以临时设置某一网卡的IP地址和子网掩码。如:
ifconfig ens33 192.168.0.200 netmask 255.255.255.0

静态配置和动态配置ip
1、动态IP上网,又叫做DHCP上网。DHCP上网类似网络ip地址租借自动获取IP上网。动态IP这种上网方式,在未使用路由器的情况下,只需要把这根宽带网线连接到电脑上,电脑上的IP地址设置为自动获得,电脑就可以实现上网了。

2、静态IP上网,又叫做固定IP地址上网。这种上网方式,宽带运营商会提供一根一个IP地址、子网掩码、网关和DNS服务器地址给用户。在未使用路由器的情况下,只需要把这根入户网线连接到电脑上,并且手动设置电脑上的IP地址,这样电脑才能上网。
1 输入命令看是配置动态还是静态sudo vi /etc/network/interfaces/
静态配置ip
#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=11.10.1.192
NETMASK=255.255.255.0
GATEWAY=10.8.8.1
DNS1=114.114.114.114
DNS2=8.8.8.8
IPV6INIT=no
USERCTL=no
动态配置ip
BOOTPROTO=dhcp
#BOOTPROTO=static
IPADDR=11.10.1.192
NETMASK=255.255.255.0
GATEWAY=10.8.8.1
DNS1=114.114.114.114
DNS2=8.8.8.8
IPV6INIT=no
USERCTL=no

2 配置相应域名 sudo vi /etc/resolv.conf

3 配置完成重启网络 sudo /etc/init.d/networking restart


总结

以上就是今天要讲的内容,本文仅仅简单介绍了基本的嵌入式理论储备知识,一部分来自自己学习过程中的总结还有网上各位朋友的总结思路,下面的高级编程2将对shell脚本编程 ,c语言高级编程,Makefile的相关介绍。感谢大家的观看

你可能感兴趣的:(笔记,嵌入式,shell)