为什么 Linux 中有些文件是二进制的?例如 /var/log/wtmp 日志?更确切地说,为什么日志是二进制形式的。
答案1
wtmp
(和)文件utmp
的历史可以追溯到 20 世纪 70 年代,设计者并没有给出太多理由。您可以看到,使用固定长度的记录utmp
来wtmp
记录记帐信息,文本日志文件会使用更多的磁盘空间,并且比仅写入二进制记录花费更多的时间来格式化消息。
进一步阅读(Unix 第 6 版手册页):
还有第一版(没有wtmp
那里):
答案2
“固定大小的记录”有一些好处。所以 utmp/wtmp 记录的历史结构是
struct utmp {
char ut_line[8]; /* tty name */
char ut_name[8]; /* user id */
char ut_host[16]; /* host name, if remote */
long ut_time; /* time on */
};
(那是来自 SunOS 4 机器;我只是选择它,因为它是一个易于阅读的条目)。
这使得将数据附加到文件并以相反的顺序显示它变得很容易,只需向后跳过sizeof(struct utmp)
字节即可。这使得像last
以相反顺序报告这样的程序变得很容易。
确切的数据结构随着时间的推移而改变,但记录的大小仍然是固定的。
例如,当前的 FreeBSD 机器具有:
struct utmpx {
short ut_type; /* Type of entry. */
struct timeval ut_tv; /* Time entry was made. */
char ut_id[8]; /* Record identifier. */
pid_t ut_pid; /* Process ID. */
char ut_user[32]; /* User login name. */
char ut_line[16]; /* Device name. */
#if __BSD_VISIBLE
char ut_host[128]; /* Remote hostname. */
#else
char __ut_host[128];
#endif
char __ut_spare[64];
};
utmp
和的另一个优点lastlog
是能够疏文件。
例如,使用lastlog
(该finger
命令用于显示上次登录时间)数据存储在基于uid
* 的偏移量处sizeof(struct lastlog)
。这样您就可以通过查找计算出的位置,快速轻松地找到uid 12345678的最后登录时间。
对于文本文件,这些好处不存在;每条记录的宽度都是可变的或者必须被填充。结果更大,更难处理,可能需要解析(long ut_time
比尝试解析 ASCII 日期字符串更容易处理)。
ASCII 对于人类和人类可能需要操作的数据来说非常有用。二进制(有时)对于程序来说更好,特别是对于人类不一定需要看到的原始数据。