- 博客(10)
- 收藏
- 关注
原创 EOF是什么?
我学习C语言的时候,遇到的一个问题就是EOF。它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上。int c;while ((c = fgetc(fp)) != EOF) {putchar ©;}很自然地,我就以为,每个文件的结尾处,有一个叫做EOF的特殊字符,读取到这个字符,操作系统就认为文件结束了。但是,后来我发现,EOF不
2021-01-14 20:25:17
82
原创 硬链接和软链接
一、硬链接一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。ln命令可以创建硬链接:ln 源文件 目标文件运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一
2021-01-14 20:24:35
37
原创 理解inode
inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。下面就是我的inode学习笔记,尽量保持简单。===================================理解inode作者:阮一峰一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储
2021-01-14 20:23:37
41
原创 代码的抽象三原则
软件开发是"抽象化"原则(Abstraction)的一种体现。所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理。开发软件的时候,一方面,我们总是希望使用别人已经写好的代码,另一方面,又希望自己写的代码尽可能重用,以求减少工作量。要做到这两个目标,这需要"抽象化"。最近,我读到美国程序员Derick Bailey的一篇文章,谈到"抽象化"应该遵循的三个原则,觉得很有启发。一、DRY原则DRY是 Don’t repeat yourself 的缩写,意思是"不要重复
2021-01-14 20:23:01
138
原创 数据压缩与信息熵
1992年,美国佐治亚州的WEB Technology公司,宣布做出了重大的技术突破。该公司的DataFiles/16软件,号称可以将任意大于64KB的文件,压缩为原始大小的16分之一。业界议论纷纷,如果消息属实,无异于压缩技术的革命。数据压缩许多专家还没有看到软件,就断言这是不可能的。因为根据压缩原理,你不可能将任意文件压缩到16分之一。事实上,有一些文件是无法压缩的,哪怕一个二进制位,都压缩不掉。后来,事实果然如此,这款软件从来没有正式发布。没过几年,就连WEB Technology公司都消失了
2021-01-14 20:22:07
116
原创 编译器的工作过程
源码要运行,必须先转成二进制的机器码。这是编译器的任务。比如,下面这段源码(假定文件名叫做test.c)。#include <stdio.h>int main(void){fputs(“Hello, world!\n”, stdout);return 0;}要先用编译器处理一下,才能运行。$ gcc test.c$ ./a.outHello, world!对于复杂的项目,编译过程还必须分成三步。$ ./configure$ make$ make install这些
2021-01-14 20:21:29
76
原创 布尔代数入门
布尔代数是计算机的基础。没有它,就不会有计算机。布尔代数发展到今天,已经非常抽象,但是它的核心思想很简单。本文帮助你理解布尔代数,以及为什么它促成了计算机的诞生。我依据的是《编码的奥妙》的第十章。这是一本好书,强烈推荐。一、数理逻辑的起源19世纪早期,英国数学家乔治·布尔(George Boole,1815-1864)突发奇想:人的思想能不能用数学表达?此前,数学只用于计算,没有人意识到,数学还能表达人的逻辑思维。两千年来,哲学书都是用文字写的。比如,最著名的三段论:所有人都是要死的,苏格拉
2021-01-14 20:20:47
290
原创 理解字节序
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。同理,0x1234567的大端字节序和小端字节序的写法如下图。我一直不理解,为什么要有字节序,每次读写都要区分,多麻烦!统一使用大端字节序,不是更方便吗?上周,我读到了一
2021-01-14 20:19:54
51
原创 根域名的知识
域名是互联网的基础设施,只要上网就会用到。它还是一门利润丰厚的生意,所有域名每年都必须交注册费,这是很大的一笔钱。这些钱交到了哪里?到底谁控制域名的价格?为什么有的域名注册费很贵,有的便宜?…今天,我就来谈谈这些与根域名(root domain)相关的知识。一、ICANN全世界域名的最高管理机构,是一个叫做 ICANN (Internet Corporation for Assigned Names and Numbers)的组织。它的总部在美国加州。它原来是美国商务部下面的一个非盈利机构,所以有
2021-01-14 20:19:09
146
原创 CAP 定理的含义
分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的。分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。本文介绍该定理。它其实很好懂,而且是显而易见的。下面的内容主要参考了 Michael Whittaker 的文章。一、分布式系统的三个指标1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标。ConsistencyAvailabilityPartition to
2021-01-14 20:17:30
34
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人