每一行代表一个已登录的用户,所显示的内容从左向右依次是:用户名、终端名、登录时间、登陆地址(通常不显示)
已登录用户的信息是放在文件/var/adm/utmp中的,who通过阅读该文件获得信息。
who命令的工作流程是:打开utmp文件,针对文件,读取一条记录,显示记录,关闭文件。
打开文件——open
从文件读取数据——read
关闭文件——close
运行结果:
who1命令存在的问题:
man -k time | grep -i transform (trans)
ctime(3)
改进之后who2的运行结果
伪代码:
打开源文件
创建目标文件
针对源文件
把源文件读入缓冲区
把缓冲区内容写入目标文件
关闭源文件和目标文件
ls:读取文件名和文件属性,按照字典序排序后输出。
常用的命令行选项:
ls -l 以长格式的形式查看当前目录下所有可见文件的详细属性 ls -a 列出的内容包含以“.”开头的文件 ls -lu 最后访问时间 ls -s 以块为单位的文件大小 ls -t 按时间排序 ls -F 显示文件类型
文件和目录被组织成目录树(tree),节点是目录或者文件
目录是一种特殊文件,文件内容就是目录和文件的名字,与utmp类似
与文件不同,目录不会为空
伪代码:
打开目录文件
针对目录文件
读取目录条目
显示文件名
关闭文件目录文件
ls -l 的输出每行都包含7个字段
模式 每行的第一个字符表示文件类型,“-”代表普通文件,“d”代表目录文件。 链接数 指该文件被引用的次数 文件所有者 指出文件所有者的用户名 组 指出文件所有者所在的组 大小 显示文件的字节数 最后修改时间 文件的最后修改时间 文件名 文件名
stat得到文件信息:定义结构体struct stat,将文件属性存放到结构体中。
通过stat得到文件大小信息:filesize。
stat提供的其他信息
st_mode 文件类型(模式) st_uid 用户所有者的ID st_gid 所属组的ID st_size 所占的字节数 st_nlink 文件链接数 st_mtime 文件最后修改时间
用掩码来解码得到文件类型:文件类型在模式字段的第一个字节的前四位,可以通过掩码来将其他部分置0,从而得到其类型的值。
文件类型宏
#define S_ISDIR(m) (((m)&0170000)) == (0040000))
将用户/组ID转换成字符串
pwd用来显示到达当前目录的路径。
每个目都有一个i-节点,内核在每个目录都设置一个指向目录本身的i-节点的入口,被称为“.”。pwd的工作原理就是追踪链接,读取目录,一个目录接着一个目录向上追踪,每一步都查看“.”的i-节点号,然后在父目录中查找该i-节点的名字,直到目录的顶端。
宏定义:BUFSIZ,标准输入,输入一个文件名
读取驱动设置并显示回显位的状态。
宏定义:
运行结果:
设置回显位的状态,命令行参数为y则开启,否则关闭。
标准输入的文件描述符为0.
使用tcgetattr()函数和termios结构体可获得标准输入的属性。
使用tcsetattr()函数和termios结构体可以将更改后的属性设置重新写回标准输入。
函数没有成功运行出来,运行程序后终端不会有任何显示,但不能够再向终端中输入任何指令,ctrl+C之后也没有效果。
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。
ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。
系统调用ioctl提供对连接到fd设备驱动程序的属性和操作访问,每种类型的设备都有自己的属性集和ioctl操作集。
例如一个屏幕终端,有一个以行和列或者以像素为单位大小的属性。
宏定义:
程序运行结果: