week2-linux基础命令(2)及相关工具函数
课本unix/linux第四章文件与目录
一.基础命令补充
第三个阅读,有篇文章叫做重定向,需要去看
1.who
显示当前用户信息
2.echo:
用于在shell中打印shell变量的值,或者直接输出指定的字符串。linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的,因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
3.date:
shell脚本里面需要打印不同格式的时间或日期
4.cal:
显示当前日历,或者指定日期的日历
5.clear:
当前终端上的任何信息就可被清除
6.passwd:
设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
passwd(选项)(参数)
选项:
-d:删除密码,仅有系统管理者才能使用;
-f:强制执行;
-k:设置只有在密码过期失效后,方能更新;
-l:锁住密码;
-s:列出密码的相关信息,仅有系统管理者才能使用;
-u:解开已上锁的帐号。
参数:用户名:需要设置密码的用户名。
示例:
[linuxde@localhost ~]$ passwd
Changing password for user linuxde. //更改linuxde用户的密码;
(current) UNIX password: //请输入当前密码;
New UNIX password: //请输入新密码;
Retype new UNIX password: //确认新密码;
passwd: all authentication tokens updated successfully. //更改成功;
7.chmod
- chmod(英文全拼:change mode)命令用来变更文件或目录的权限
- Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)
- 在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。
- 用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。
- 权限范围的表示法如下:
u
User,即文件或目录的拥有者;
g
Group,即文件或目录的所属群组;
o
Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;
a
All,即全部的用户,包含拥有者,所属群组以及其他用户;
r
读取权限,数字代号为“4”;
w
写入权限,数字代号为“2”;
x
执行或切换权限,数字代号为“1”;
-
不具任何权限,数字代号为“0”;
s
特殊功能说明:变更文件或目录的权限
(1)语法
chmod(选项)(参数)
(2)参数
1.权限模式mode:指定文件的权限模式;
-
mode : 权限设定字串,格式如下 :
-
[ugoa...][[+-=][rwxX]...][,...]
-
其中:
-
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
- + 表示增加权限,- 表示取消权限、= 表示唯一设定权限。
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
2.文件file:要改变权限的文件。
(3)知识扩展和实例
Linux用 户分为:拥有者、组群(Group)、其他(other),Linux系统中,预设的情況下,系统中所有的帐号与一般身份使用者,以及root的相关信 息, 都是记录在/etc/passwd
文件中。每个人的密码则是记录在/etc/shadow
文件下。 此外,所有的组群名称记录在/etc/group
內!
(4)示例
例:rwx rw- r–
r=读取属性 //值=4
w=写入属性 //值=2
x=执行属性 //值=1
chmod u+x,g+w f01 //为文件f01设置自己可以执行,组员可以写入的权限
chmod u=rwx,g=rw,o=r f01
chmod 764 f01
chmod a+x f01 //对文件f01的u,g,o都设置可执行属性
文件的属主和属组属性设置
chown user:market f01 //把文件f01给uesr,添加到market组
ll -d f1 查看目录f1的属性
8.file
file命令用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程。
(1)语法:
file(选项)(参数)
(2)参数
文件:要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。
(3)示例
[root@localhost ~]# file install.log
install.log: UTF-8 Unicode text
[root@localhost ~]# file -b install.log <== 不显示文件名称
UTF-8 Unicode text
[root@localhost ~]# file -i install.log <== 显示MIME类别。
install.log: text/plain; charset=utf-8
补充:MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种[应用程序]来打开的方式类型,当该扩展名文件被访问的时候,[浏览器]会自动使用指定应用程序来打开。
9.man
man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。
(1)语法
man(选项)(参数)
(2)选项
-a:在所有的man帮助手册中搜索;
-f:等价于whatis指令,显示给定关键字的简短描述信息;
-P:指定内容时使用分页程序;
-M:指定man手册搜索的路径。
(3)参数
- 数字:指定从哪本man手册中搜索帮助;
- 关键字:指定要搜索帮助的关键字。
(4)实例
我们输入man ls
,它会在最左上角显示“LS(1)”,在这里,“LS”表示手册名称,而“(1)”表示该手册位于第一节章,同样,我们输man ifconfig
它会在最左上角显示“IFCONFIG(8)”。也可以这样输入命令:“man [章节号] 手册名称”。
man是按照手册的章节号的顺序进行搜索的,比如:
man sleep
只会显示sleep命令的手册,如果想查看库函数sleep,就要输入:
man 3 sleep
10.time
time命令用于统计给定命令所花费的总时间。
(1)语法:
time (参数:指令即指定需要运行的额指令及其参数。)
(2)示例
当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。例如:
[root@localhost ~]# time ls
anaconda-ks.cfg install.log install.log.syslog satools text
real 0m0.009s
user 0m0.002s
sys 0m0.007s
输出的信息分别显示了该命令所花费的real时间、user时间和sys时间。
- real时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。
- user时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。
- sys时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。
11.pgrep
pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。
语法
pgrep(选项)(参数)
选项
-o:仅显示找到的最小(起始)进程号;
-n:仅显示找到的最大(结束)进程号;
-l:显示进程名称;
-P:指定父进程号;
-g:指定进程组;
-t:指定开启进程的终端;
-u:指定进程的有效用户ID。
参数
进程名称:指定要查找的进程名称,同时也支持类似grep指令中的匹配模式。
示例:查找进程httpd
[root@localhost ~]# pgrep -l httpd
4557 httpd
4560 httpd
4561 httpd
4562 httpd
4563 httpd
4564 httpd
4565 httpd
4566 httpd
12.ps
Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。
语法
ps [options] [--help]
参数:
- ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义
- -A 列出所有的进程
- -w 显示加宽可以显示较多的资讯
- -au 显示较详细的资讯
- -aux 显示所有包含其他使用者的行程
- au(x) 输出格式 :
- USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
- USER: 行程拥有者
- PID: pid
- %CPU: 占用的 CPU 使用率
- %MEM: 占用的记忆体使用率
- VSZ: 占用的虚拟记忆体大小
- RSS: 占用的记忆体大小
- TTY: 终端的次要装置号码 (minor device number of tty)
- STAT: 该行程的状态:
- D: 无法中断的休眠状态 (通常 IO 的进程)
- R: 正在执行中
- S: 静止状态
- T: 暂停执行
- Z: 不存在但暂时无法消除
- W: 没有足够的记忆体分页可分配
- <: 高优先序的行程
- N: 低优先序的行程
- L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
- START: 行程开始时间
- TIME: 执行的时间
- COMMAND:所执行的指令
实例
# ps -A 显示进程信息
PID TTY TIME CMD
1 ? 00:00:02 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 watchdog/0
6 ? 00:00:00 events/0
7 ? 00:00:00 cpuset
8 ? 00:00:00 khelper
9 ? 00:00:00 netns
10 ? 00:00:00 async/mgr
11 ? 00:00:00 pm
12 ? 00:00:00 sync_supers
13 ? 00:00:00 bdi-default
14 ? 00:00:00 kintegrityd/0
15 ? 00:00:02 kblockd/0
16 ? 00:00:00 kacpid
17 ? 00:00:00 kacpi_notify
18 ? 00:00:00 kacpi_hotplug
19 ? 00:00:27 ata/0
……省略部分结果
30749 pts/0 00:00:15 gedit
30886 ? 00:01:10 qtcreator.bin
30894 ? 00:00:00 qtcreator.bin
31160 ? 00:00:00 dhclient
31211 ? 00:00:00 aptd
31302 ? 00:00:00 sshd
31374 pts/2 00:00:00 bash
31396 pts/2 00:00:00 ps
显示指定用户信息
# ps -u root //显示root进程用户信息
PID TTY TIME CMD
1 ? 00:00:02 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 watchdog/0
6 ? 00:00:00 events/0
7 ? 00:00:00 cpuset
8 ? 00:00:00 khelper
9 ? 00:00:00 netns
10 ? 00:00:00 async/mgr
11 ? 00:00:00 pm
12 ? 00:00:00 sync_supers
13 ? 00:00:00 bdi-default
14 ? 00:00:00 kintegrityd/0
15 ? 00:00:02 kblockd/0
16 ? 00:00:00 kacpid
……省略部分结果
30487 ? 00:00:06 gnome-terminal
30488 ? 00:00:00 gnome-pty-helpe
30489 pts/0 00:00:00 bash
30670 ? 00:00:00 debconf-communi
30749 pts/0 00:00:15 gedit
30886 ? 00:01:10 qtcreator.bin
30894 ? 00:00:00 qtcreator.bin
31160 ? 00:00:00 dhclient
31211 ? 00:00:00 aptd
31302 ? 00:00:00 sshd
31374 pts/2 00:00:00 bash
31397 pts/2 00:00:00 ps
显示所有进程信息,连同命令行
# ps -ef //显示所有命令,连带命令行
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:22 ? 00:00:02 /sbin/init
root 2 0 0 10:22 ? 00:00:00 [kthreadd]
root 3 2 0 10:22 ? 00:00:00 [migration/0]
root 4 2 0 10:22 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 10:22 ? 00:00:00 [watchdog/0]
root 6 2 0 10:22 ? /usr/lib/NetworkManager
……省略部分结果
root 31302 2095 0 17:42 ? 00:00:00 sshd: root@pts/2
root 31374 31302 0 17:42 pts/2 00:00:00 -bash
root 31400 1 0 17:46 ? 00:00:00 /usr/bin/python /usr/sbin/aptd
root 31407 31374 0 17:48 pts/2 00:00:00 ps -ef
13.改文件名
mv 2-4.h 2-4.c
二.补充文件系统的相关知识(第四章)
1.文件
文件本质上是一个存放数据的容器,unix 文件系统中,每一个存放在磁盘上的文件由以下两部分组成:
- 数据块一一实际存放文件数据的磁盘块。
- inode一-UNIX 文件系统中用于描述文件特征的数据结构,它包含文件的重要信息,如数据在磁盘上的地址,文件中数据块的大小,文件的属主是谁等。inode 也称为文件索引结点或信息结点。在同一个文件系统中,每一个inode 有唯一的标识号,称为inode号,也称为文件顺序号。
2.文件类型
UNIX 文件系统有几种不同类型的文件:普通文件、目录、特别文件、有名管道( FIFO ) 、符号链接和套接字。
3.文件的属主关系
:拥有此文件的用户和组。
4.文件的访问权限:
是否允许文件属主、同组用户以及其他人读、写或执行该文件。
5.文件的时间戳:
文件的修改时间、最后一次访问时间、最后一次修改inode 的时间。
6.实例:
UNIX 命令"Is -1" 可查看到inode 的大部分内容, “Is -i” 可显示出文件的inode 号,而命令stat 则几乎列出了inode 的每一项内容。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I72FRMwq-1603450771227)(assets/1603184226331.png)]
三、老师补充(有点乱)
1.linux中点开头的属于系统文件
2.Ext3(Third extended filesystem)第三代扩展文件系统
- .文件系统:由字符路径转化为i-node节点号得到物理地址
- .目录(文件):
-
- 从路径中去取关键字检索出i-node号
- 由index-node索引节点完成两件事
- 第一件是安全,权限检查
- 第二件通过地址表访问物理块
3.一些函数工具的使用
(1)对比反汇编和汇编文件,一个用objdump -d 命令生成汇编语言代码,里面main前面有很多其他的函数,期中frame_dummy是分配内存,time fimename可以查看运行时间,一个是gcc,使用之后调试观察
(2)strace进行动态调试,列出了在执行程序时调用的所有系统调用,找到运行时错误:具体https://man.linuxde.net/strace
(3)execve:内核级系统调用,派生子进程 :https://www.cnblogs.com/jxhd1/p/6706701.html
(4)brk(null):中断
(5)mmap(null,8192,prot_read|…):加载虚表
(6)access开始到wirte之前都是操作系统在运行内核
if((n=write()!=0)
{
printf(“ok!”)
}
(7)对于时间time的解释。黑框就是命令解释器shell,派生两个子进程,当派生了两个子进程,则父进程进入休眠状态,等待子进程;时间只记小数点后三位,所以会归零;
补充:strace,execve,brk建议看此文章:https://www.coder.work/article/1512025
4.终端,tty,shell,console
终端(terminal)=tty=文本的输入输出环境
控制台(console)=物理终端
shell=命令行解释器