嵌入式系统开发-麦子学院(4)——Linux C初级编程2

上篇文章讲到了Linux C初级编程的C语言基础部分:https://blog.csdn.net/QiHsMing/article/details/84947781

下面接着Linux C初级编程的Linux基础部分。

linux 操作系统基础

linux系统的发展

1991年,linus编写8000行代码,完成linux系统0.01版。基于内核之上的linux系统有8000种以上。

linux系统的组成结构:

Linux系统一般有4个主要部分:

内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
在这里插入图片描述

1)kernel(内核):包围在硬件之上,控制系统程序和硬件之间的交互。
作用:负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图:
在这里插入图片描述

2)shell(外壳):包围在kernel之上。
作用:提供人机交互界面,用户与内核交互的工具。
不同的shell命令解释不一样,命令提示符也不一样
常用的sell:sh,bash,csh,ksh,tcsh。

3)文件系统:组织管理文件目录

linux系统的特性:① 多用户 ②多任务 ③多平台

文件系统详解

文件系统分类:
1)磁盘文件系统:NTFS,EXT3
2)闪存文件系统:JFFS2,YAFFS
3)数据库文件系统:BFFS,WINFS
4)网络文件系统:NFS
5)虚拟文件系统:VFS(proc)

文件系统功能:
① 能定义文件的组织方式,文件结构
② 提供建立和存储文件的环境
③ 能对文件存储器空间进行组织和分配
④负责文件存储并对存入的文件进行保护和检索
⑤负责建立文件,存入,读取,修改,转储文件,控制文件的存储,撤销文件等。

linux文件系统的特点:

1)EXT3

ext3是基于日志方式的文件系统。系统中每个文件都是有索引,用户对文件的每个操作都会有日志记录,形成一个任务队列依次执行。

2)SWAP swap是交换分区的文件系统。swap是linux的虚拟内存,是物理内存的两倍。

linux文件类型与文件属性

教程链接:http://os.51cto.com/art/200910/157965.htm

linux文件信息分为:文件类型、权限、链接数、所属用户、所属用户组、文件大小、最后修改时间、文件名,具体的可以见下图。(使用ll或ls -l查看文件的信息)
在这里插入图片描述
1)七种文件类型
①普通文件:通常是流式文件
②目录文件:用于表示和管理系统中的全部文件
③连接文件:用于不同目录下文件的共享
④⑤设备文件:包括块设备文件和字符设备文件,块设备文件表示磁盘文件、光盘等,字符设备文件按照字符操作终端、键盘等设备。
⑥管道(FIFO)文件:提供进程建通信的一种方式
⑦套接字(socket)文件:该文件类型与网络通信有关

Linux系统中文件颜色都代表的意思

1.蓝色代表目录
2.绿色代表可执行文件
3.红色代表压缩文件
4.浅蓝色代表链接文件
5.灰色代表其他文件
6.红色闪烁代表链接文件有问题
7.黄色代表设备文件
8.白色代表一般性文件,如:文本文件、配置文件、源码文件等

2)linux系统的目录结构

教程链接:http://f.dataguru.cn/forum.php?mod=viewthread&ordertype=1&tid=301468

Linux目录结构的组织形式和Windows有很大的不同。首先Linux没有“盘(C盘、D盘、E盘)”的概念。已经建立文件系统的硬盘分区被挂载到某一个目录下,用户通过操作目录来实现磁盘读写。

Linux不像Windows那样的系统目录,Linux使用正斜杠"/“而不是反斜杠”"来标识目录。
在这里插入图片描述

以下是对这些目录的解释:

/bin:
bin是Binary的缩写, 这个目录存放着最经常使用的命令。

/boot:
这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。

/dev :
dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。

/etc:
这个目录用来存放所有的系统管理所需要的配置文件和子目录。

/home:
用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

/lib:
这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

/media:
linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。

/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

/opt:
 这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

/proc:
这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
/root:
该目录为系统管理员,也称作超级权限者的用户主目录。

/sbin:
s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

/selinux:
 这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

/srv:
 该目录存放一些服务启动之后需要提取的数据。

/sys:
 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。

sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。
 

该文件系统是内核设备树的一个直观反映。

当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

/tmp:
这个目录是用来存放一些临时文件的。

/usr:
 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

/usr/bin:
系统用户使用的应用程序。

/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。

/usr/src:内核源代码默认的放置目录。

/var:
这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

在linux系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。

/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的。

值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给root使用的指令。

/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,另外mail的预设放置也是在这里。

与windows系统的区别
在这里插入图片描述

shell命令篇

命令行别名的使用

alias 别名='命令'						 --建立别名 
alias								  	 --打印别名列表 
unalias 别名								 --取消别名

shell的特殊字符

1.通配符:* ?[]

1) * :通配0个或多个字符
2)?:通配任意单个字符
3)[s] :通配某个范围内的任意一个字符

2.多命令一行输入: ;

3.输入输出重定向 :>,<,>>

1)输出重定向

  >:将一个命令的输出放入文件而非在屏幕输出
  >>: 输入重定向在原文件末尾追加

2)输入重定向

	< 	从标准输入设备输入

4.管道符:|

5.其他:%,$, ~
%:作业控制,提示符等
$:取某一列的值,取变量值等
~:home目录

常用命令

1.联机帮助:man
	man 命令名 			查看这个命令的帮助
	man  -k  keyword		
	man 使用中的快捷键:
					 spacebar	翻页
					 Enter		翻行
					 b			向前翻页
					 f			向后翻页
					 q			退出
					 /string		查找字符
					 n				查找下一个字符			
2.清屏:clear
3.历史命令

history
history n 显示n个历史命令

4.文件相关

1)查看文件盒目录
① pwd:显示当前工作目录
② cd :改变当前工作目录

cd 	~ 				进入home目录
cd  -				返回上次目录
cd  ..			进入上级目录

③ ls:列出当前目录的文件和子目录

ls  -a 	列出从当前目录开始的所有目录、子目录、文件盒隐藏文件
ls  -R	列出从当前目录开始的所有的子目录、文件并且一层层遍历
ls  -F	列出文件、目录名并显示出文件类型
ls  -t 	以修改时间为倒序列出文件、子目录

④ file:显示文件的具体文件属性,ELF头
⑤ touch :创建文件

	touch filename
	filename 不存在则创建一个新的文件,存在则更新文件的访问时间

⑥ mkdir :创建目录

	mkdir [-p]	dir_name			-p表示目录不存在时才可创建

⑦ 删除文件/目录

	rm filename
	-i 		删除前确认
	-f 		强制删除
	-r 		删除目录及其所有文件

⑧ 显示文本内容

cat 	filename 		不分屏显示文本的内容

more	filename		分屏显示输出的内容	
more的操作键:
		spacbebar		向下显示一屏
		enter			向下显示一行
		b				向上一屏
		f				向下一屏
		h				显示帮助菜单
		q				退出
		/string			查找
	
head	filename		查看文件的前几行

tail	filename			查找文件的末尾多少行 

⑨ cp 和 mv

cp 复制文件/目录
	-i		原文件		目标文件
	-r		原目录		目标目录

.

mv	移动、重命名文件/目录
mv 	原文件/目录		目标文件/目录
5.链接文件
教程:https://www.cnblogs.com/liwei0526vip/p/4998614.html

1)linux文件管理特性
在Linux 上文件分成两个部分:用户数据(user data )与元数据(metadata).

用户数据:即文件数据块(data block),数据块时记录文件真是内容的地方
元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。元数据中的inode号(索引节点号)才是文件的唯一标识,系统或程序通过inode号找正确文件数据块。

在这里插入图片描述
2 ) 为什么需要链接文件
为了解决linux系统的文件共享,隐藏文件路径、增加权限安全及节省存储。

3)链接文件分为:硬链接(hard link)与软链接(soft link)。
① 硬链接(hard link)

Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

② 软链接(soft link)

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

建立链接文件:

ln	[-s	-P]	source_file	target_file

-s 		建立软链接
-P		建立硬链接
6.文件权限

教程:https://www.linuxidc.com/Linux/2016-08/134047.htm

linux系统中的每个文件/目录都有访问和操作权限。
权限的分类:
① r 读权限
② w 写权限
③ x 执行权限
④ - 没有权限
在这里插入图片描述

权限所属对象
在这里插入图片描述
前三个为属主位:创建该文件者或被指定的文件所属者

中间三个为属组位:文件的所属组,在该组内的非属主用户对该文件拥有该属组权限。

最后三个Other位:other用户,既不属于属主又不在属组的用户

修改linux文件权限命令:
教程:https://www.cnblogs.com/Berryxiong/p/6193866.html
1)chmod

chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

  • 文字设定法
    chmod [who] [+ | – | =] [mode] 文件名¼

命令中各选项的含义为:
操作对象who可是下述字母中的任一个或者它们的组合:

u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:

+添加某个权限。
– 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。
-c : 若该档案权限确实已经更改,才显示其更改动作
-f : 若该档案权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
–help : 显示辅助说明
–version : 显示版本
文件名:以空格分开的要改变权限的文件列表,支持通配符。在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r example使同组和其他用户对文件example 有读权限。

  • 数字设定法
    我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。

例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
数字设定法的一般形式为:chmod [mode] 文件名¼

与文件属主同组人用户(g) 拥有读权限
其他人(o) 拥有读权限

2)chown
更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户yusi,为了让用户yusi能够存取这个文件,root用户应该把这个文件的属主设为yusi,否则,用户yusi无法存取这个文件。
语法:chown [选项] 用户或组 文件

说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。

参数说明:

user : 新的档案拥有者的使用者 ID
group : 新的档案拥有者的使用者群体(group)
-c : 若该档案拥有者确实已经更改,才显示其更改动作
-f : 若该档案拥有者无法被更改也不要显示错误讯息
-h : 只对于连结(link)进行变更,而非该 link 真正指向的档案
-v : 显示拥有者变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)
–help : 显示辅助说明
–version : 显示版本

3)chgrp

改变文件或目录所属的组。

语法:chgrp [选项] group filename¼

参数:

-c或–changes 效果类似”-v”参数,但仅回报更改的部分。
-f或–quiet或–silent  不显示错误信息。
-h或–no-dereference  只对符号连接的文件作修改,而不更动其他任何相关文件。
-R或–recursive  递归处理,将指定目录下的所有文件及子目录一并处理。
-v或–verbose  显示指令执行过程。
–help  在线帮助。
–reference=<参考文件或目录>  把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。
–version  显示版本信息。
该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。

该命令的各选项含义为:

– R 递归式地改变指定目录及其下的所有子目录和文件的属组。

7.查找过滤与统计

1)find
find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。

语法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

查找选项:通过文件属性来查找

-name						按文件名
-user						按文件属主
-size						按大小
-ctime	-n					按最近 n 天内更新过的文件
-mtime						按最后一次修改时间
-atime						按最后一次访问时间
-type						按文件类型		f: file			d:	directory
-perm						按权限

实例

将目前目录及其子目录下所有延伸档名是 c 的文件列出来。

# find . -name "*.c"

将目前目录其其下子目录中所有一般文件列出

# find . -type f

将目前目录及其子目录下所有最近 20 天内更新过的文件列出

# find . -ctime -20

查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:

# find /var/log -type f -mtime +7 -ok rm {} \;

查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:

# find . -type f -perm 644 -exec ls -l {} \;

为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:

# find / -type f -size 0 -exec ls -l {} \;

2)locate
locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。

优缺点:
查询速度快,locate是通过inode文件索引来查找的,会把文件索引维护在一个数据库中。缺点是需要更新数据库。

语法
locate [-d ][–help][–version][范本样式…]

参数:

-d或--database= 配置locate指令使用的数据库。locate指令预设的数据库位于/var/lib/slocate目录里,文档名为slocate.db,您可使用 这个参数另行指定。
--help  在线帮助。
--version  显示版本信息。

3)grep
grep命令用于查找文件里符合条件的字符串。

语法

grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

参数:

-a 或 --text : 不要忽略二进制的数据。
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c 或 --count : 计算符合样式的列数。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的普通表示法来使用。
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i 或 --ignore-case : 忽略字符大小写的差别。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-q 或 --quiet或--silent : 不显示任何信息。
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-s 或 --no-messages : 不显示错误信息。
-v 或 --revert-match : 显示不包含匹配文本的所有行。
-V 或 --version : 显示版本信息。
-w 或 --word-regexp : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定"-i"参数相同。

实例

在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:

grep test *file 

结果如下所示:

$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件  
testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行  
testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行  
testfile_2:Linux test #列出testfile_2 文件中包含test字符的行 

以递归的方式查找符合条件的文件
例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:

grep -r update /etc/acpi 

输出结果如下:

$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi”  
#下包含“update”的文件  
/etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.)  
Rather than  
/etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of  
IO.) Rather than  
/etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update 

反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。

查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:

grep -v test *test*

结果如下所示:

$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行  
testfile1:helLinux!  
testfile1:Linis a free Unix-type operating system.  
testfile1:Lin  
testfile_1:HELLO LINUX!  
testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.  
testfile_1:THIS IS A LINUX TESTFILE!  
testfile_2:HELLO LINUX!  
testfile_2:Linux is a free unix-type opterating system. 

4)wc
wc命令用于计算字数。
利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。

语法

wc [-clw][--help][--version][文件...]

参数:

-c或--bytes或--chars 只显示Bytes数。
-l或--lines 只显示行数。
-w或--words 只显示字数。
--help 在线帮助。
--version 显示版本信息。

实例
在默认的情况下,wc将计算指定文件的行数、字数,以及字节数。使用的命令为:

wc testfile 

先查看testfile文件的内容,可以看到:

$ cat testfile  
Linux networks are becoming more and more common, but scurity is often an overlooked  
issue. Unfortunately, in today’s environment all networks are potential hacker targets,  
fro0m tp-secret military research networks to small home LANs.  
Linux Network Securty focuses on securing Linux in a networked environment, where the  
security of the entire network needs to be considered rather than just isolated machines.  
It uses a mix of theory and practicl techniques to teach administrators how to install and  
use security applications, as well as how the applcations work and why they are necesary. 

使用 wc统计,结果如下:

$ wc testfile           # testfile文件的统计信息  
3 92 598 testfile       # testfile文件的行数为3、单词数92、字节数598 

其中,3 个数字分别表示testfile文件的行数、单词数,以及该文件的字节数。

如果想同时统计多个文件的信息,例如同时统计testfile、testfile_1、testfile_2,可使用如下命令:

wc testfile testfile_1 testfile_2   #统计三个文件的信息 

输出结果如下:

$ wc testfile testfile_1 testfile_2  #统计三个文件的信息  
3 92 598 testfile                    #第一个文件行数为3、单词数92、字节数598  
9 18 78 testfile_1                   #第二个文件的行数为9、单词数18、字节数78  
3 6 32 testfile_2                    #第三个文件的行数为3、单词数6、字节数32  
15 116 708 总用量                    #三个文件总共的行数为15、单词数116、字节数708 
8.时间

1) date

date 根据给定格式显示日期或设置系统日期时间。

命令语法:

date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

命令参数:

-d  	显示字符串描述的时间

-f     显示DATEFILE文件中的每行时间

-r    显示文件的最后修改时间

-R    以RFC-2822兼容日期格式显示时间

-rfc-2822    以RFC-2822兼容日期格式显示时间

-s    设置时间为string

-u    显示或设定为Coordinated Universal Time时间格式

--help    显示date命令的帮助信息

--version    显示date命令的版本信息

Format参数格式
要说写这位程序的 David MacKenzie老兄,真是事无巨细啊,居然整了这么多格式参数,佩服佩服。

%%    显示字符%

%a    星期几的缩写(Sun..Sat)

%A    星期几的完整名称(Sunday...Saturday)

%b    月份的缩写(Jan..Dec)

%B    月份的完整名称(January..December)

%c    日期与时间。只输入date指令也会显示同样的结果

%C    世纪(年份除100后去整) [00-99]

%d    日期(以01-31来表示)。

%D    日期(含年月日)。

%e    一个月的第几天 ( 1..31)

%F    日期,同%Y-%m-%d

%g    年份(yy)

%G    年份(yyyy)

%h    同%b

%H    小时(00..23)

%I    小时(01..12)

%j    一年的第几天(001..366)

%k    小时( 0..23)

%l    小时( 1..12)

%m    月份(01..12)

%M    分钟(00..59)

%n    换行

%N    纳秒(000000000..999999999)

%p    AM or PM

%P    am or pm

%r    12小时制时间(hh:mm:ss [AP]M)

%R    24小时制时间(hh:mm)

%s    从00:00:00 1970-01-01 UTC开始的秒数

%S    秒(00..60)

%t    制表符

%T    24小时制时间(hh:mm:ss)

%u    一周的第几天(1..7); 1 表示星期一

%U    一年的第几周,周日为每周的第一天(00..53)

%V    一年的第几周,周一为每周的第一天 (01..53)

%w    一周的第几天 (0..6); 0 代表周日

%W    一年的第几周,周一为每周的第一天(00..53)

%x    日期(mm/dd/yy)

%X    时间(%H:%M:%S)

%y    年份(00..99)

%Y    年份 (1970…)

%z    RFC-2822 风格数字格式时区(-0500)

%Z    时区(e.g., EDT), 无法确定时区则为空

2 ) cal
cal命令可以用来显示公历(阳历)日历。

命令格式: cal [参数][月份][年份]

命令功能:
用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表示月份和年份

命令参数:

-1 显示一个月的月历	
-3 显示系统前一个月,当前月,下一个月的月历	
-s  显示星期天为一个星期的第一天,默认的格式	
-m 显示星期一为一个星期的第一天
-j  显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)
-y  显示当前年份的日历		
9.进程

1) ps

ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。

① 查看所有进程

$ ps ax
$ ps -e

加上 -f 或者 u 参数可以显示进程的详细信息

$ ps aux
$ ps -ef

注:当用户名超过8个字符时,以uid显示;小于等于8字符时,以用户名显示。

② 显示某个用户的进程

$ ps -f -u nova,neutron

③ 通过进程名或者进程id显示进程

$ ps -C neutron-server
# -C 只能搜索名为neutron-server的进程(完全匹配),不能使用部分搜索或者通配符,例如 ps -C neutron 就不会显示neutron-server进程。因此部分匹配用 ps -ef | grep neutron

$ ps -f -p 3150,7298,6544

④ 利用 cpu 或者内存使用量对进程排序

$ ps aux --sort=-pcpu,+pmem
# 首先以 cpu 使用量排序呢, 如果 cpu 使用量相同,则以内存使用量排序。
$ ps aux --sort=-pcpu,+pmem | head 5

⑤ 显示 ASCII 进程树

$ ps -ef --forest
$ ps -f --forest -C neutron-server

⑥ 显示父进程的子进程

$ ps -o pid,uname,comm -C neutron-server
28208 hebin    neutron-server
28221 hebin    neutron-server
28222 hebin    neutron-server
28223 hebin    neutron-server
28224 hebin    neutron-server
28225 hebin    neutron-server

$ ps --ppid 28208
 PID TTY          TIME CMD
28221 pts/12   00:00:06 neutron-server
28222 pts/12   00:00:06 neutron-server
28223 pts/12   00:01:02 neutron-server
28224 pts/12   00:00:52 neutron-server
28225 pts/12   00:00:28 neutron-server

⑦ 显示进程的线程

$ ps -ef | grep rock-mon
root     14447     1  0 12:47 ?        00:02:01 /usr/bin/python /usr/bin/rock-mon
root     32279 31077  0 23:03 pts/0    00:00:00 grep --color=auto rock-mon

$ ps -p 14447 -L
  PID   LWP TTY          TIME CMD
14447 14447 ?        00:00:00 rock-mon
14447 14480 ?        00:00:09 rock-mon
14447 14483 ?        00:00:00 rock-mon
14447   597 ?        00:00:00 rock-mon
14447   759 ?        00:00:00 rock-mon

⑧ 改变显示的字段

$ ps -e -o pid,uname,pcpu,pmem,comm
$ ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm

⑨ 显示进程已运行的时间

$ ps -e -o pid,comm,etime

⑩ 用ps命令实时显示进程信息

$ watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15'
10.用户账号与密码

进入管理员模式:

$ su
password

退出管理员模式:

# exit

1)shutdown
shutdown命令可以用来进行关机程序,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机。

使用权限:系统管理者。

语法

shutdown [-t seconds] [-rkhncfF] time [message]

参数说明:

-t seconds : 设定在几秒钟之后进行关机程序
-k : 并不会真的关机,只是将警告讯息传送给所有只用者
-r : 关机后重新开机
-h : 关机后停机
-n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机
-c : 取消目前已经进行中的关机动作
-f : 关机时,不做 fcsk 动作(检查 Linux 档系统)
-F : 关机时,强迫进行 fsck 动作
time : 设定关机的时间
message : 传送给所有使用者的警告讯息

实例

立即关机

# shutdown -h now

指定5分钟后关机

# shutdown +5 “System will shutdown after 5 minutes” //5分钟够关机并显示警告信息

2) reboot
reboot命令用于用来重新启动计算机。

若系统的 runlevel 为 0 或 6 ,则重新开机,否则以 shutdown 指令(加上 -r 参数)来取代

语法

reboot [-n] [-w] [-d] [-f] [-i]

参数:

-n : 在重开机前不做将记忆体资料写回硬盘的动作
-w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
-d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
-f : 强迫重开机,不呼叫 shutdown 这个指令
-i : 在重开机之前先把所有网络相关的装置先停止

实例
重新启动

# reboot

3)Linux初始root密码设置

Ubuntu刚安装后,不能在terminal中运行su命令,因为root没有默认密码,需要手动设定.

sudo passwd root 

4)修改密码

passwd

5) 查找用户

id
查看用户ID(用户名),所属组ID(组名)

users
查看已经登陆到当前系统中的用户,只显示出用户名。

who
查看当前用户的详细信息

who am i / whoami
查看当前用户自己的信息

11.网络

1)ping

查看当前机器与另一台机器的联通状况。
用法: ping ip/域名

2)ifconfig
参考教程:http://man.linuxde.net/ifconfig
ifconfig命令被用于配置和显示Linux内核中网络接口的网络参数。

语法:ifconfig(参数)

显示网络设备信息(激活状态的):

[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3E:00:1E:51  
          inet addr:10.160.7.81  Bcast:10.160.15.255  Mask:255.255.240.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:61430830 errors:0 dropped:0 overruns:0 frame:0
          TX packets:88534 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3607197869 (3.3 GiB)  TX bytes:6115042 (5.8 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:56103 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56103 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:5079451 (4.8 MiB)  TX bytes:5079451 (4.8 MiB)

说明:

eth0表示第一块网卡,其中HWaddr表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC地址)是00:16:3E:00:1E:51。

inet addr用来表示网卡的IP地址,此网卡的IP地址是10.160.7.81,广播地址Bcast:10.160.15.255,掩码地址Mask:255.255.240.0。

lo是表示主机的回环地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 httpd服务器的指定到回环地址,在浏览器输入127.0.0.1就能看到你所架WEB网站了。但只是您能看得到,局域网的其它主机或用户无从知道。

第一行:连接类型:Ethernet(以太网)HWaddr(硬件mac地址)。
第二行:网卡的IP地址、子网、掩码。
第三行:UP(代表网卡开启状态)RUNNING(代表网卡的网线被接上)MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节。
第四、五行:接收、发送数据包情况统计。
第七行:接收、发送数据字节数统计信息。

启动关闭指定网卡:

ifconfig eth0 up
ifconfig eth0 down

为网卡配置和删除IPv6地址:

ifconfig eth0 add 33ffe:3240:800:1005::2/64    #为网卡eth0配置IPv6地址
ifconfig eth0 del 33ffe:3240:800:1005::2/64    #为网卡eth0删除IPv6地址

用ifconfig修改MAC地址:

ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE

配置IP地址:

[root@localhost ~]# ifconfig eth0 192.168.2.10
[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0
[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255

启用和关闭arp协议:

ifconfig eth0 arp    #开启网卡eth0 的arp协议
ifconfig eth0 -arp   #关闭网卡eth0 的arp协议

设置最大传输单元:

ifconfig eth0 mtu 1500    #设置能通过的最大数据包大小为 1500 bytes
12.应用程序

linux 常见的软件程序包

rpm
rpm是红帽子系统定义的软件包文件格式

deb
deb是ubuntu系统定义的软件包的格式

linux下的安装包的命名格式
软件包名称_版本号-修订版本_体系架构.扩展名

linux 安装卸载应用程序的方式
①安装包离线安装和卸载:dpkg

dpkg 	-i	<package> 	安装包
dpkg	-p	<package>	移除包

②源码包编译安装和卸载

三步:
./configure
make
make install

③在线安装和卸载

	apt-get	intall	<package>	安装
	apt-get	remove	-purge	<package>	完全卸载
13.磁盘信息

1)du

du会显示指定的目录或文件所占用的磁盘空间。

实例

显示目录或者文件所占空间:
只显示当前目录下面的子目录的目录大小和当前目录的总的大小,最下面的1288为当前目录的总大小

	# du
	608     ./test6
	308     ./test4
	4       ./scf/lib
	4       ./scf/service/deploy/product
	4       ./scf/service/deploy/info
	12      ./scf/service/deploy
	16      ./scf/service
	4       ./scf/doc
	4       ./scf/bin
	32      ./scf
	8       ./test3
	1288    .

显示指定文件所占空间

# du log2012.log 
300     log2012.log

方便阅读的格式显示test目录所占空间情况:

# du -h test
608K    test/test6
308K    test/test4
4.0K    test/scf/lib
4.0K    test/scf/service/deploy/product
4.0K    test/scf/service/deploy/info
12K     test/scf/service/deploy
16K     test/scf/service
4.0K    test/scf/doc
4.0K    test/scf/bin
32K     test/scf
8.0K    test/test3
1.3M    test

2) df
df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。

实例

显示文件系统的磁盘使用情况统计:

# df 
Filesystem     1K-blocks    Used     Available Use% Mounted on 
/dev/sda6       29640780 4320704     23814388  16%     / 
udev             1536756       4     1536752    1%     /dev 
tmpfs             617620     888     616732     1%     /run 
none                5120       0     5120       0%     /run/lock 
none             1544044     156     1543888    1%     /run/shm 
第一列指定文件系统的名称,第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。用和可用列正在使用中,分别指定的内存量。

使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。

df也可以显示磁盘使用的文件系统信息:

# df test 
Filesystem     1K-blocks    Used      Available Use% Mounted on 
/dev/sda6       29640780    4320600   23814492  16%       / 

用一个-i选项的df命令的输出显示inode信息而非块使用量。

df -i 
Filesystem      Inodes    IUsed    IFree     IUse% Mounted on 
/dev/sda6      1884160    261964   1622196   14%        / 
udev           212748     560      212188    1%         /dev 
tmpfs          216392     477      215915    1%         /run 
none           216392     3        216389    1%         /run/lock 
none           216392     8        216384    1%         /run/shm 

显示所有的信息:

# df --total 
Filesystem     1K-blocks    Used    Available Use% Mounted on 
/dev/sda6       29640780 4320720    23814372  16%     / 
udev             1536756       4    1536752   1%      /dev 
tmpfs             617620     892    616728    1%      /run 
none                5120       0    5120      0%      /run/lock 
none             1544044     156    1543888   1%      /run/shm 
total           33344320 4321772    27516860  14% 

我们看到输出的末尾,包含一个额外的行,显示总的每一列。

-h选项,通过它可以产生可读的格式df命令的输出:

# df -h 
Filesystem      Size  Used   Avail Use% Mounted on 
/dev/sda6       29G   4.2G   23G   16%     / 
udev            1.5G  4.0K   1.5G   1%     /dev 
tmpfs           604M  892K   603M   1%     /run 
none            5.0M     0   5.0M   0%     /run/lock 
none            1.5G  156K   1.5G   1%     /run/shm 

我们可以看到输出显示的数字形式的’G’(千兆字节),“M”(兆字节)和"K"(千字节)。

这使输出容易阅读和理解,从而使显示可读的。请注意,第二列的名称也发生了变化,为了使显示可读的"大小"。

GNU工具简介

1.GUN开发环境

1) GCC

关于GCC上篇文章已经详细分析了,这里就不多说列。
在这里插入图片描述

在这里插入图片描述

动态链接库与静态链接库

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。 windows上对应的是.lib .dll linux上对应的是.a .so
在这里插入图片描述
所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:
在这里插入图片描述
静态库

之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。

试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。静态库特点总结:

  1. 静态库对函数库的链接是放在编译时期完成的。
  2. 程序在运行时与函数库再无瓜葛,移植方便。
  3. 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

Linux下创建与使用静态库

Linux静态库命名规则
Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a。

创建静态库(.a)
通过上面的流程可以知道,Linux创建静态库过程如下:

1. 将代码文件编译成目标文件.o
2. 通过ar工具将目标文件打包成.a静态库文件

动态库
通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢?

为什么还需要动态库?

其实也是静态库的特点导致。空间浪费是静态库的一个问题。

在这里插入图片描述
另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。

在这里插入图片描述
动态库特点总结:

  1. 动态库把对一些库函数的链接载入推迟到程序运行的时期。
  2. 可以实现进程之间的资源共享。(因此动态库也称为共享库)。
  3. 将一些程序升级变得简单。
  4. 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

GCC 编译的警告选项
在这里插入图片描述
GCC编译的优化选项
在这里插入图片描述

GDB

GDB调试步骤:

1) debug模式编译: gcc -g

2) debug 运行程序: gdb 程序

3) 打断点: b(reak) 函数名 、行号 、文件名:行号、行号 if条件

4) 查看断点: i(nfo) b(reak)

5) 删除断点: d(elete) 断点号

6) 运行调试: r(run) c(ontinue) q(uit)

7) 单步调试: n(ext) -step over s(tep) -step into f(inish) --step return

8) 打印和监控值 w(atch) 值

2. Autotool

1.Makefile

作用:(1) 工程文件组织,编译成复杂的程序 (2) 安装和卸载程序

Makefile的语法规则:

1) Makefile 显式规则:

			targets(目标) :prerequisites(依赖)
				command(命令)
				伪目标:只执行命令
				
		targets(目标) 
				command(命令)


2) Makefiel 隐式规则: 自动找依赖文件

Makefile的变量:


1) 用户自定义变量

2) 预定义变量:系统自带变量

3) 自动变量和环境变量

在这里插入图片描述

make工作流程


1) make 在当前目录下找名为“Makefile”的文件

2) 在文件中找第一个目标文件(target)并把文件作为最终的目标文件

3) 根据时间戳生成目标文件

4) 递归寻找目标文件依赖文件,并且递归生成。

Makefile 引用及嵌套


1) 包含:include /makefile

2) 嵌套:subsystem:

 cd subdir && $(MAKE)

Makefile 管理命令
在这里插入图片描述

autotools

autotools是系列工具, 它主要由autoconf、automake、perl语言环境和m4等组成。

所包含的命令有五个:
在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值