20135203齐岳 信息安全系统设计基础第十周学习总结

20135203齐岳 信息安全系统设计基础第十周——怎样学习系统编程(利用Linux学习Linux编程)

一、who命令

1.who命令能做些什么?

每一行代表一个已登录的用户,所显示的内容从左向右依次是:用户名、终端名、登录时间、登陆地址(通常不显示)

2.who命令是如何工作的?

已登录用户的信息是放在文件/var/adm/utmp中的,who通过阅读该文件获得信息。

744942-20151114211334697-1617456501.jpg

744942-20151114211343165-860905751.jpg

who命令的工作流程是:打开utmp文件,针对文件,读取一条记录,显示记录,关闭文件。

3.如何编写who?

who1

打开文件——open

从文件读取数据——read

关闭文件——close

744942-20151114211416915-328453606.jpg

744942-20151114211427634-1942023562.jpg

运行结果:

744942-20151114211504212-1526609099.jpg

who2

who1命令存在的问题:

  • 清除空白记录:ut_type当它的取值为7(USR_PROCESS)时,表示这是一个已经登陆的用户。

744942-20151114211522494-2016293041.jpg

  • 时间转换(以可读的方式显示时间):

man -k time | grep -i transform (trans)

ctime(3)

744942-20151114211619681-801806265.jpg

改进之后who2的运行结果

744942-20151114211634337-53596427.jpg

二、cp命令

cp能干什么?

cp src dst
744942-20151114211701650-2140618360.jpg

如何实现cp

伪代码:

打开源文件
创建目标文件
针对源文件
把源文件读入缓冲区
把缓冲区内容写入目标文件
关闭源文件和目标文件

三、ls命令

ls能干什么

ls:读取文件名和文件属性,按照字典序排序后输出。

744942-20151114223515369-1079623735.jpg

常用的命令行选项:

ls -l   以长格式的形式查看当前目录下所有可见文件的详细属性
ls -a   列出的内容包含以“.”开头的文件
ls -lu  最后访问时间
ls -s   以块为单位的文件大小
ls -t   按时间排序
ls -F   显示文件类型

文件树

文件和目录被组织成目录树(tree),节点是目录或者文件

目录是一种特殊文件,文件内容就是目录和文件的名字,与utmp类似

与文件不同,目录不会为空

如何编写ls

基本ls

伪代码:

打开目录文件
针对目录文件
读取目录条目
显示文件名
关闭文件目录文件

744942-20151114225053697-1387341373.jpg

ls -l

ls -l 的输出每行都包含7个字段

模式          每行的第一个字符表示文件类型,“-”代表普通文件,“d”代表目录文件。
链接数     指该文件被引用的次数
文件所有者   指出文件所有者的用户名
组           指出文件所有者所在的组
大小          显示文件的字节数
最后修改时间  文件的最后修改时间
文件名     文件名

stat得到文件信息:定义结构体struct stat,将文件属性存放到结构体中。

通过stat得到文件大小信息:filesize。

744942-20151114225017884-1296342963.jpg

stat提供的其他信息

st_mode     文件类型(模式)
st_uid      用户所有者的ID
st_gid      所属组的ID
st_size     所占的字节数
st_nlink    文件链接数
st_mtime    文件最后修改时间

744942-20151114225041650-1785598588.jpg

将模式字段转换成字符
744942-20151114225128150-1314685356.jpg

用掩码来解码得到文件类型:文件类型在模式字段的第一个字节的前四位,可以通过掩码来将其他部分置0,从而得到其类型的值。

文件类型宏
#define S_ISDIR(m) (((m)&0170000)) == (0040000))

将用户/组ID转换成字符串

  • /etc/passwd包含字符列表
  • 通过getpwuid(3)来得到完整的用户列表
  • getpwuid需要user ID作为参数,返回一个指向struct passwd的指针。

改进后的ls运行的结果:
744942-20151114225110259-1756060501.jpg

四、pwd命令

pwd的工作过程

pwd用来显示到达当前目录的路径。

744942-20151115212749556-182247379.jpg

每个目都有一个i-节点,内核在每个目录都设置一个指向目录本身的i-节点的入口,被称为“.”。pwd的工作原理就是追踪链接,读取目录,一个目录接着一个目录向上追踪,每一步都查看“.”的i-节点号,然后在父目录中查找该i-节点的名字,直到目录的顶端。

编写pwd

744942-20151115212907384-650971135.jpg

宏定义:BUFSIZ,标准输入,输入一个文件名

744942-20151115213009759-1814569613.jpg

五、编写终端驱动程序

echostate

读取驱动设置并显示回显位的状态。

744942-20151115224715228-954611858.jpg

宏定义:

744942-20151115224731447-1705136526.jpg

运行结果:

744942-20151115224806665-1503222243.jpg

setecho

设置回显位的状态,命令行参数为y则开启,否则关闭。

标准输入的文件描述符为0.
使用tcgetattr()函数和termios结构体可获得标准输入的属性。
使用tcsetattr()函数和termios结构体可以将更改后的属性设置重新写回标准输入。

函数没有成功运行出来,运行程序后终端不会有任何显示,但不能够再向终端中输入任何指令,ctrl+C之后也没有效果。

ioctl函数

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。

ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。

744942-20151115222244369-1903594555.jpg

744942-20151115222257103-227782938.jpg

系统调用ioctl提供对连接到fd设备驱动程序的属性和操作访问,每种类型的设备都有自己的属性集和ioctl操作集。

例如一个屏幕终端,有一个以行和列或者以像素为单位大小的属性。

744942-20151115222312337-57622402.jpg

宏定义:

744942-20151115222444822-350718291.jpg

程序运行结果:

744942-20151115222345931-1822125941.jpg

参考资料

1.《深入理解计算机系统》

2.《Unix-Linux编程实践教程》(Understanding.UNIX_LINUX.Programming)

3.《linux系统下的ioctl函数》http://www.cnblogs.com/li-hao/archive/2011/12/22/2297687.html

4.《UNIX-LINUX编程实践教程->实例代码注解》http://www.cnblogs.com/cation/archive/2013/03/06/2945464.html

转载于:https://www.cnblogs.com/July0207/p/4965808.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值