who

在Unix中,任何可以被 shell 解释的命令都是一个其他人编写的程序。

who 用来查看当前登录系统的用户数量及其信息。

man 命令 用来查看特定命令的详细信息,包括所有后面可以紧跟的所有参数,每个参数的具体功能、用法等等。

who 的原理:who命令显示出的信息是通过读取某个文件实现的,该文件记录所有已登录用户的信息。该文件名称为utmp


文件相关命令

read将一定数目的字节读入到缓冲区,需要一个文件描述符作为参数。
read(int fd, void *buf, size_t n) 从fd指定的文件中读取n个字节放到buf指向的内存空间中。读取成功会返回读取的字
节数(文件剩余的字节数可能少于指定的字节数),否则返回-1。

open在进程和文件之间建立一条连接,该连接称为文件描述符。
open(char *name, int how)接收一个文件名和预定义的打开模式,若正常打开,返回一个整数值,即文件描述符;否则返回-1。打开多个文件或者同一个文件被打开多次,文件描述符都不相同。

close(int fd)关闭fd表示的进程和某个文件的连接。失败则返回-1。

create(char *filename, mode_t mode)创建一个文件名为filename的文件。如果文件不存在,则创建,权限设为mode;如果存在,则清空该文件,将其权限设为mode。

write(int fd, char *buf, int n)将buf指向的内存空间中的n个字节数写入到fd表示的文件中。写入成功返回实际写入的字节数,否则返回-1.调用之后需要比较返回值和n的大小检查是否真正写入成功。

普通程序进行文件操作,只能通过内核提供的系统调用进行。执行系统调用时,需要将运行模式切换到内核状态,调用完成后切换回用户状态。这种切换状态需要的时间开销相对较大,若经常进行这种切换操作,则时间开销会很大。尽量使用缓冲技术减少系统调用的次数。

通常情况下,用户程序和磁盘上的文件进行交互需要使用缓冲区提高访问速度。用户读磁盘上的文件的顺序为,用户从内核缓冲区寻找该文件,如果没有,则用户进程挂起,等待内核从磁盘中将该文件读入到内核的缓冲区中,然后将其从内核缓冲区复制到用户缓冲区中;如果有,直接将其从内核缓冲区复制到用户缓冲区中。写文件也是将其从用户缓冲区写入到内核缓冲区中,在某个特定的时间点内核将其从内核缓冲区写入到磁盘中。

读写文件的时候,每个文件描述符都有一个与之关联的指针。首次打开(或者创建并打开)文件时,指针指向文件的开头,当读写操作时,该指针移动到下一个未被读取写入的字符位置。

lseek(int fd, int offset, int base)fd表示和文件关联的文件描述符,base表示指针移动的基准点,基准点有三个,分别是文件开始(0)、当前位置(1)和文件结尾(3)。offset表示相对于基准点的位移量。将文件中的指针移动到base+offset表示的位置。

标签: Linux, 文件, 内核, int, 缓冲区, 写入, Unix, fd

相关文章推荐

添加新评论,含*的栏目为必填