1,Linux系统的常用命令(包括参数)
{1}用户切换(su)
(1)作用
变更为其它使用者的身份,主要用于将普通用户身份转变为超级用户,而且需输入相应用户密码。
(2)格式
su [选项] [使用者]
其中的使用者为要变更的对应使用者。
(3)常见参数
-,-l,--login:为该使用者重新登录,大部分环境变量(如HOME、SHELL和USER等)和工作目录都是以该使用者(USER)为主。若没有指定USER,缺省情况是root
-m,-p:执行su时不改变环境变量
-c,--command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者
{2}用户管理命令
useradd:添加用户账号
useradd [选项] 用户名
usermod:设置用户账号属性
usermod [选项] 属性值
userdel:删除对应用户账号
userdel [选项] 用户名
groupadd:添加组账号
groupadd [选项] 组账号
groupmod:设置组账号属性
groupmod [选项] 属性值
groupdel:删除对应组账号
groupdel [选项] 组账号
passwd:设置账号密码
passwd [对应账号]
id:显示用户ID、组ID和用户所属的组列表
id [用户名]
groups:显示用户所属的组
groups [组账号]
who:显示登录到系统的所有用户
who
{3}系统管理命令
ps:显示当前系统中由该用户运行的进程列表
ps [选项]
top:动态显示系统中运行的程序(一般为每隔5s) top
kill:输出特定的信号给指定PID(进程号)的进程
kill [选项] 进程号(PID)
uname显示系统的信息(可加选项-a)
uname [选项]
setup:系统图形化界面配置
setup
crontab:循环执行例行性命令
crontab [选项]
shutdown:关闭或重启Linux系统
shutdown [选项] [时间]
uptime:显示系统已经运行了多长时间
uptime
clear:清除屏幕上的信息
clear
{4}磁盘相关命令
free:查看当前系统内存的使用情况
free [选项]
df :查看文件系统的磁盘空间占用情况
df [选项]
du :统计目录(或文件)所占磁盘空间的大小
du [选项]
fdisk :查看硬盘分区情况及对硬盘进行分区管理
fdisk [-l]
{5}文件系统挂载命令(mount)
(1)作用
挂载文件系统,它的使用权限是超级用户或/etc/fstab中允许的使用者。挂载是指把分区和目录对应的过程,而挂载点是指挂载在文件树中的位置。mount命令就可以把文件系统挂载到相应的目录下,并且由于Linux中把设备都当作文件一样使用,因此,mount命令也可以挂载不同的设备。通常,在Linux下“/mnt”目录是专门用于挂载不同的文件系统的,它可以在该目录下新建不同的子目录来挂载不同的设备文件系统。
(2)格式
mount [选项] [类型] 设备文件名 挂载点目录
其中的类型是指设备文件的类型。
(3)常见参数
-a:依照/etc/fstab的内容装载所有相关的硬盘
-l:列出当前已挂载的设备、文件系统名称和挂载点
-t: 类型将后面的设备以指定类型的文件格式装载到挂载点上。常见的类型有前面介绍过的几种:vfat、ext3、ext2、iso9660、nfs等
-f:通常用于除错。它会使mount不执行实际挂上的动作,而是模拟整个挂上的过程,通常会和-v一起使用
{6}文件相关命令
cd:改变当前工作目录
cd [路径]
ls:列出目录和文件的信息
ls [选项] [文件]
mkdir :创建一个目录
mkdir [选项] 路径
grep :在指定文件中搜索特定的内容,并将含有这些内容的行标准输出
grep [选项] 格式 [文件及路径]
{8}文件比较合并相关命令
diff:比较两个不同的文件或不同目录下的两个同名文件功能,并生成补丁文件。
diff[选项] 文件1 文件2
diff比较文件1和文件2的不同之处,并按照选项所指定的格式加以输出。diff的格式分为命令格式和上下文格式,其中上下文格式又包括了旧版上下文格式和新版上下文格式,命令格式分为标准命令格式、简单命令格式及混合命令格式,它们之间的区别会在使用实例中进行详细地讲解。当选项缺省时,diff默认使用混合命令格式。
patch:命令跟diff配合使用,把生成的补丁文件应用到现有代码上。
patch [选项] [待patch的文件[patch文件]]。
常用的格式为:patch -pnum [patch文件],其中的-pnum是选项参数。
{9}网络相关命令
netstat:显示网络连接、路由表和网络接口信息
netstat [-an]
nslookup查询一台机器的IP地址和其对应的域名
nslookup [IP地址/域名]
finger:查询用户的信息
finger [选项] [使用者] [用户@主机]
ping:用于查看网络上的主机是否在工作
ping [选项] 主机名/IP地址
ifconfig:查看和配置网络接口的参数
ifconfig [选项] [网络接口]
ftp:利用ftp协议上传和下载文件
telnet:利用telnet协议浏览信息
telent [选项] [IP地址/域名]
ssh:利用ssh登录对方主机
ssh [选项] [IP地址]
2,Vi的常用命令
插 入 (insert)
-- i 从 光 标 所 在 位 置 前 面 开 始 插 入 资 料, 光 标 後 的 资 料 随 新 增 资 料 向 後 移 动。
-- I 从 光 标列 的 第 一 个 非 空 白 字 符 前 面 开 始 插 入 资 料。
vi用法 --- 修改和删除
x 删除光标所在字符。
dd 删除光标所在的列。
r 修改光标所在字符,r後接著要修正的字符
R进入取代状态,新增资料会覆改原先资料, 直到按[ESC]回到指令模式下为止。
s 删除光标所在字符,并进入输入模式。
S 删除光标所在的列,并进入输入模式。
vi用法 --- 退出
<:q>不保存退出
<:q!>不保存强制性退出
<:w>保存编辑
<:w filename>存入文件filename 中
<:w! filename>强制性存入文件filename 中
<:wq>(<:x>)保存并退出(shift+zz)
vi用法 --- 光标移动
<b>移动到当前单词的开始
<e>移动到当前单词的结尾
<w>向前移动一个单词
<h>向前移动一个字符
<j>向上移动一行
<k>向下移动一行
<l>向后移动一个字符
vi用法 --- 替换操作
<r>替换光标所在的字符
<R>替换字符序列
<cw>替换一个单词
<ce>同<cw>
<cb>替换光标所在的前一字符
<c$>替换自光标位置至行尾的所有字符
<C>同<c$>
<cc>替换当前行
vi用法 --- 复制与粘贴
</yw>将光标所在单词拷入剪贴板
<y$>将光标至行尾的字符拷入剪贴板
<Y>同<y$>
<yy>将当前行拷入剪贴板
<p>将剪贴板中的内容粘贴在光标后
<P>将剪贴板中的内容粘贴在光标前
3,Gcc的使用(掌握常用参数)
gcc --- 常用选项
gcc ---库选项
函数库分为静态库和动态库两种,静态库是一系列的目标文件(.o文件)的归档文件(文件名格式为libname.a),如果在编译某个程序时链接静态库,则链接器将会搜索静态库,从中提取出它所需要的目标文件并直接拷贝到该程序的可执行二进制文件(ELF格式文件)之中;动态库(文件名格式为libname.so[.主版本号.次版本号.发行号])在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。
gcc --- 警告选项
gcc --- 优化选项
gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。
不同的优化级别对应不同的优化处理工作。如使用优化选项“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。使用优化选项“-O2”除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作。
可能适合使用优化选项的场合:程序发行
不太适合使用优化选项的场合:程序开发
gcc --- 体系结构相关选项
4,Gdb的常用命令
gdb工作环境相关命令
gdb设置断点与恢复命令
gdb中源码查看相关相关命令
gdb中查看运行数据的相关命令
5,简单makefile的编写(具体自己找程序看)
makefile是make读入的惟一配置文件,因此本节的内容实际就是讲述makefile的编写规则。在一个makefile中通常包含如下内容:
· 需要由make工具创建的目标体(target),通常是目标文件或可执行文件;
· 要创建的目标体所依赖的文件(dependency_file);
创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头。
6,嵌入式操作系统的分类(软件架构角度)
答:软件架构角度:单体结构,分层结构,微内核结构;
单体结构优点:性能好,通信开销小;缺点:体积庞大、高度集成、相互关联
分层结构:这种结构要求在每个层次上都要提供一组API接口函数,这就会带来额外的开销
微内核结构:易于扩展、调试方便、易于移植,但是速度可能会慢
7,嵌入式中间件的概念、思路、特点
中间件(Middleware):在OS内核、设备驱动程序和应用软件之外的所有系统软件;
中间件的基本思路:把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件,从而为运行在其上的各个应用软件提供一个灵活、安全、移植性好、相互通信、协同工作的平台;
优点:实现软件的可重用,降低应用软件的复杂性,降低开发成本。
8,Ifconfig命令配置IP地址、子网掩码
Ifconfig eth0 210.25.132.142 netmask 255.255.255.0
9,Linux的文件类型及其字母表示
d 目录文件;l 符号链接;s 套接字文件;b 块设备文件/二进制文件;c 字符设备文件;p 命名管道文件;-普通文件
10,系统调用,编程接口
系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。例如用户可以通过进程控制相关的系统调用来创建进程、实现进程调度、进程管理等。
在实际使用中程序员调用的通常是用户编程接口——API
11,进程间通信的方式及其特点
(1)管道(Pipe)及有名管道(named pipe)
(2)信号(Signal):直接进行用户空间进程和内核进程之间的交互,
(3)消息队列(Messge Queue):可以实现消息的随机查询,比FIFO具有更大的优势,消息又是存在于内核中的,由“队列ID”来标识。
(4)共享内存(Shared memory):直接读写内存,不需要任何数据的拷贝
(5)信号量(Semaphore):用来解决进程之间的同步与互斥问题的一种进程之间通信机制
(6)套接字(Socket):
12,查看文件信息,查询进程信息
cat :连接并显示指定的一个和多个文件的有关信息。
cat[选项]文件1文件2…
其中的文件1、文件2为要显示的多个文件
13,修改文件主,文件组,文件操作权限
chmod :改变文件的访问权限。具体看书
14,文件的复制、删除、移动、改名
cp:将给出的文件或目录复制到另一文件或目录中。
cp:cp [选项] 源文件或目录 目标文件或目录
mv:为文件或目录改名或将文件由一个目录移入另一个目录中。
mv [选项] 源文件或目录 目标文件或目录
rm:删除一个目录中的一个或多个文件或目录。
rm [选项] 文件或目录
chown:修改文件所有者和组别。
chown [选项]...文件所有者[所有者组名] 文件
其中的文件所有者为修改后的文件所有者。
chgrp:改变文件的组所有权。
chgrp:chgrp [选项]... 文件所有组 文件
其中的文件所有组为改变后的文件组拥有者。
chmod :改变文件的访问权限。
chmod [选项]…符号权限[符号权限]…文件
chmod [选项] …八进制权限 文件…
15,打包命令,压缩命令
压缩打包相关命令
bzip2:.bz2文件的压缩(或解压)程序
bzip2[选项] 压缩(解压缩)的文件名
bunzip2:.bz2文件的解压缩程序
bunzip2[选项] .bz2压缩文件
bzip2recover:用来修复损坏的.bz2文件
bzip2recover .bz2压缩文件
gzip:.gz文件的压缩程序
gzip [选项] 压缩(解压缩)的文件名
gunzip:解压被gzip压缩过的文件
gunzip [选项] .gz文件名
unzip:解压winzip压缩的.zip文件
unzip [选项] .zip压缩文件
compress:早期的压缩或解压程序(压缩后文件名为.Z)
compress [选项] 文件
tar:对文件目录进行打包或解包
tar [选项] [打包后文件名]文件目录列表
16,文件锁及其编程操作
文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。
17,I/O处理的模型
阻塞I/O模型:在这种模型下,若所调用的I/O函数没有完成相关的功能,则会使进程挂起,直到相关数据到达才会返回。如常见对管道设备、终端设备和网络设备进行读写时经常会出现这种情况。
· 非阻塞模型:在这种模型下,当请求的I/O操作不能完成时,则不让进程睡眠,而且立即返回。非阻塞I/O使用户可以调用不会阻塞的I/O操作,如open()、write()和read()。如果该操作不能完成,则会立即返回出错(例如:打不开文件)或者返回0(例如:在缓冲区中没有数据可以读取或者没空间可以写入数据)。
· I/O多路转接模型:在这种模型下,如果请求的I/O操作阻塞,且它不是真正阻塞I/O,而是让其中的一个函数等待,在这期间,I/O还能进行其他操作。如本节要介绍的select()和poll函数(),就是属于这种模型。
· 信号驱动I/O模型:在这种模型下,通过安装一个信号处理程序,系统可以自动捕获特定信号的到来,从而启动I/O。这是由内核通知用户何时可以启动一个I/O操作决定的。
· 异步I/O模型:在这种模型下,当一个描述符已准备好,可以启动I/O时,进程会通知内核。现在,并不是所有的系统都支持这种模型。
18,串口的三种模式
规范模式,非规范模式,原始模式
19,串口配置的流程
1.保存原先串口配置2.激活选项3.设置波特率4.设置字符大小5.设置奇偶校验位6.设置停止位7.设置最少字符和等待时间8.清除串口缓冲9.激活配置
20,进程的概念、状态、分段
进程是一个程序的一次执行的过程,同时也是资源分配的最小单元。
一个进程应该包括:
程序的代码;
程序的数据;
PC中的值,用来指示下一条将运行的指令;
一组通用的寄存器的当前值,堆、栈;
一组系统资源(如打开的文件)
总之,进程包含了正在运行的一个程序的所有状态信息。
执行态:该进程正在运行,即进程正在占用CPU。
就绪态:进程已经具备执行的一切条件,正在等待分配CPU的处理时间片。
等待态:进程不能使用CPU,若等待事件发生(等待的资源分配到)则可将其唤醒。
Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。
21,exit()和_exit()的联系和区别
exit()和_exit()函数都是用来终止进程的。
_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;exit()函数则在这些基础上做了一些包装,在执行退出之前加了若干道工序。exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的“清理I/O缓冲”一项。
由于在Linux的标准函数库中,有一种被称作“缓冲I/O(buffered I/O)”操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。每次读文件时,会连续读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区中读取;同样,每次写文件的时候,也仅仅是写入内存中的缓冲区,等满足了一定的条件(如达到一定数量或遇到特定字符等),再将缓冲区中的内容一次性写入文件。若想保证数据的完整性,就一定要使用exit()函数
22,守护进程的编写步骤
23,守护进程的出错处理
一种通用的办法是使用syslog服务,将程序中的出错信息输入到系统日志文件中,从而可以直观地看到程序的问题所在。
24,管道的概念和特点
所谓管道即连接两个任务之间的一个打开的共享文件,专用于任务之间的数据通信;
管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fds[0]和fds[1],其中fds[0]固定用于读管道,而fd[1]固定用于写管道,这样就构成了一个半双工的通道。
25,信号的生命期
一个完整的信号生命周期可以分为3个重要阶段,这3个阶段由4个重要事件来刻画的:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数
26,用户进程对信号的处理方式
信号处理的主要方法有两种,一种是使用简单的signal()函数,另一种是使用信号集函数组。
27,信号的编程、
249-250页
28,信号量的概念和使用步骤
信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(PV操作)。
信号量的使用:
第一步:创建信号量或获得在系统已存在的信号量,此时需要调用semget()函数。不同进程通过使用同一个信号量键值来获得同一个信号量。
第二步:初始化信号量,此时使用semctl()函数的SETVAL操作。当使用二维信号量时,通常将信号量初始化为1。
第三步:进行信号量的PV操作,此时调用semop()函数。这一步是实现进程之间的同步和互斥的核心工作部分。
第四步:如果不需要信号量,则从系统中删除它,此时使用semclt()函数的IPC_RMID操作。此时需要注意,在程序中不应该出现对已经被删除的信号量的操作。
29,共享内存的概念和使用步骤
共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据的拷贝。为了在多个进程间交换信息,内核专门留出了一块内存区。这段内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高了效率。
共享内存的实现分为两个步骤,
第一步是创建共享内存,这里用到的函数是shmget(),也就是从内存中获得一段共享内存区域。
第二步映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中,这里使用的函数是shmat()。
30,消息队列的概念和使用步骤
消息队列就是一些消息的列表。用户可以从消息队列中添加消息和读取消息等,可以实现消息的随机查询,消息又是存在于内核中的,由“队列ID”来标识。
消息队列的实现包括
创建或打开消息队列、
添加消息、
读取消息
控制消息队列
这四种操作。
31,消息队列的编程
268页
32,C语言的位操作
33,写出Linux系统的信号处理函数singal的原型,并对该函数进行解释
该函数原型整体指向了一个无返回值并且带一个整型参数的函数指针
34,什么是交叉编译?什么是交叉调试?
所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。嵌入式的交叉编译也包括交叉编译、交叉链接等过程
交叉调试是宿主机和目标机之间进行的交叉调试,调试器依然运行在宿主机的通用操作系统上,但被调试的进程运行在特定的硬件平台的嵌入式中,调试器和被调试进程通过串口或者网络进行通信。
35,什么是优先级反转?如何应对优先级反转?
优先级翻转是当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。
解决优先级翻转问题有优先级天花板(priority ceiling)和优先级继承(priority inheritance)两种办法。(来自百度)
1)单调速率调度(Rate Monotonic Scheduling,RMS) 算法;RMS是一种静态优先级调度算法,也是最常用的一种确定任务优先级的算法;
思路:单位时间内任务被执行的次数越多,优先级越高。即任务的周期越短,优先级越高。
2)最早期限优先(Earliest Deadline First, EDF) 调度算法:EDF是一种动态优先级调度算法,也是性能最好的一种调度算法;
基本思路:对时间期限最近的任务,分配最高的优先级。