Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比

1、概论 -- 来自维基的解释

/dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。

在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole)。空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件。这些操作通常由重定向完成。

/dev/zero  : 在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。

其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。BSD就是通过mmap把/dev/zero映射到虚地址空间实现共享内存的。可以使用mmap将/dev/zero映射到一个虚拟的内存空间,这个操作的效果等同于使用一段匿名的内存(没有和任何文件相关)。

2、 /dev/null 的日常使用

把/dev/null看作"黑洞"。它等价于一个只写文件,并且所有写入它的内容都会永远丢失,而尝试从它那儿读取内容则什么也读不到。然而, /dev/null对命令行和脚本都非常的有用。

我们都知道  cat $filename  会输出filename对应的文件内容(输出到标准输出)

而使用         cat $filename >/dev/null  则不会得到任何信息,因为我们将本来该通过标准输出显示的文件信息重定向到了 /dev/null 中,so what will you get ?

使用  cat $filename 1>/dev/null 也会得到同样的效果,因为默认重定向的 1 就是标准输出。  如果你对 shell 脚本或者重定向比较熟悉的话,应该会联想到 2 ,也即标准错误输出。

我们使用 cat $filename  时如果filename对应的文件不存在,系统肯定会报错: “ cat: filename: 没有那个文件或目录 ” 。

如果我们不想看到错误输出呢?我们可以禁止标准错误:   cat $badname 2>/dev/null

我们可以通过下面这个测试来更加深刻的理解/dev/null :

<span style="font-size:18px">$cat test.txt

just for test

$cat test.txt >/dev/null

$cat test.txt 1>/dev/null

$cat test2.txt

cat: test2.txt: 没有那个文件或目录

$cat test2.txt >/dev/null

cat: test2.txt: 没有那个文件或目录

$cat test2.txt 2>/dev/null

$

</span>

有些时候,我并不想看道任何输出,我只想看到这条命令运行是不是正常,那么我们可以同时禁止标准输出和标准错误的输出:    

       cat $filename 2>/dev/null >/dev/null

所以:

* 如果"$filename"不存在,将不会有任何错误信息提示,

* 如果"$filename"存在, 文件的内容不会打印到标准输出。

* 因此, 上面的代码根本不会输出任何信息,当只想测试命令的退出码而不想有任何输出时非常有用。

下一步,我们使用 echo $? 查看上条命令的退出码:0为命令正常执行,1-255为有出错。

当然,使用   cat $filename &>/dev/null   也可以达到  cat $filename 2>/dev/null >/dev/null 一样的效果。

<span style="font-size:18px">$cat test2.txt 2>/dev/null

$cat test.txt 2>/dev/null >/dev/null

$echo $?

0

$cat test2.txt 2>/dev/null >/dev/null

$echo $?

1

$cat test.txt &>/dev/null

$echo $?

0

</span>

有时候,我们需要删除一些文件的内容而不删除文件本身:(这个方法可以用来删除日志文件,在我的Debian笔记本上我给 /var 盘配的空间有些过小,有时候就需要手动使用这个操作来清空日志)    

 # cat /dev/null > /var/log/messages

 # : > /var/log/messages   有同样的效果,但不会产生新的进程。(因为:是内建的)


下面的实例中,使用/dev/null 来删除cookie 并且不再使用cookie

<span style="font-size:18px"> if [ -f ~/.netscape/cookies ]      # 如果存在则删除,删除后才可以添加软链接

then

  rm -f ~/.netscape/cookies

fi

ln -s /dev/null ~/.netscape/cookies </span>

其中,cookies的目录是可以变换的,比如说我自己电脑上的firefox的cookie目录为: ~/.mozilla/firefox/nah4b6di.default/cookies*

3、/dev/zero 的日常使用

像/dev/null一样,/dev/zero也是一个伪文件,但它 实际上产生连续不断的null的流 (二进制的零流,而不是ASCII型的)。 写入它的输出会丢失不见 ,/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,像临时交换文件。

比如说,在我的前一篇博客中(《 尝试安装Chrome OS的新版本 Vanilla & 安装之后U盘遇到的问题解决 》),提到我使用dd 制作的U盘系统,而我的U盘有16G,而制作好后,系统盘只占了2.5G,而其他的空间(将近12G)都无发使用。我只能使用  dd if=/dev/zero of=/dev/sdb bs=4M 来重新给我整个U盘清零。

脚本实例 1. 用/dev/zero创建一个交换临时文件

<span style="font-size:18px">#!/bin/bash

# 创建一个交换文件,参数为创建的块数量(不带参数则为默认),一块为1024B(1K)

ROOT_UID=0        # Root 用户的 $UID 是 0.

E_WRONG_USER=65    # 不是 root?

FILE=/swap

BLOCKSIZE=1024

MINBLOCKS=40

SUCCESS=0

# 这个脚本必须用root来运行,如果不是root作出提示并退出

if [ "$UID" -ne "$ROOT_UID" ]

then

  echo; echo "You must be root to run this script."; echo

  exit $E_WRONG_USER

fi


blocks=${1:-$MINBLOCKS}          # 如果命令行没有指定,则设置为默认的40块.

# 上面这句等同如:

# --------------------------------------------------

# if [ -n "$1" ]

# then

#  blocks=$1

# else

#  blocks=$MINBLOCKS

# fi

# --------------------------------------------------

if [ "$blocks" -lt $MINBLOCKS ]

then

  blocks=$MINBLOCKS              # 最少要有 40 个块长,如果带入参数比40小,将块数仍设置成40

fi

echo "Creating swap file of size $blocks blocks (KB)."

dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # 把零写入文件.

mkswap $FILE $blocks            # 将此文件建为交换文件(或称交换分区).

swapon $FILE                    # 激活交换文件.

echo "Swap file created and activated."

exit $SUCCESS

</span>

运行效果我们可以看到: 

<span style="font-size:18px">long@Raring:/tmp$ vim testswap.sh

long@Raring:/tmp$ chmod +x testswap.sh         

long@Raring:/tmp$ sudo ./testswap.sh         

[sudo] password for long: 

long@Raring:/tmp$ ./testswap.sh         

You must be root to run this script.

long@Raring:/tmp$ sudo ./testswap.sh         

[sudo] password for long:   

Creating swap file of size 40 blocks (KB).

记录了40+0 的读入

记录了40+0 的写出

40960字节(41 kB)已复制,0.000904021 秒,45.3 MB/秒

正在设置交换空间版本 1,大小 = 36 KiB

无标签, UUID=3e59eddf-098f-454d-9507-aba55f434a8c

Swap file created and activated.

</span>

关于 /dev/zero 的另一个应用是为特定的目的而用零去填充一个指定大小的文件,如挂载一个文件系统到环回设备 (loopback device) 或"安全地" 删除一个文件。

脚本实例2. 创建ramdisk

<span style="font-size:18px">#!/bin/bash

# ramdisk.sh

# "ramdisk"是系统RAM内存的一段,它可以被当成是一个文件系统来操作.

# 优点:存取速度非常快 (包括读和写).

# 缺点: 易失性, 当计算机重启或关机时会丢失数据.

# 会减少系统可用的RAM.

#

# 那么ramdisk有什么作用呢?

# 保存一个较大的数据集在ramdisk, 比如一张表或字典,这样可以加速数据查询, 因为在内存里查找比在磁盘里查找快得多.

E_NON_ROOT_USER=70            # 必须用root来运行.

ROOTUSER_NAME=root

MOUNTPT=/mnt/ramdisk

SIZE=2000                      # 2K 个块 (可以合适的做修改)

BLOCKSIZE=1024                # 每块有1K (1024 byte) 的大小

DEVICE=/dev/ram0              # 第一个 ram 设备

username=`id -nu`

if [ "$username" != "$ROOTUSER_NAME" ]

then

  echo "Must be root to run ""`basename $0`""."

  exit $E_NON_ROOT_USER

fi

if [ ! -d "$MOUNTPT" ]        # 测试挂载点是否已经存在了,

then                          #+ 如果这个脚本已经运行了好几次了就不会再建这个目录了

  mkdir $MOUNTPT              #+ 因为前面已经建立了.

fi

dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE # 把RAM设备的内容用零填充.

                                                      # 为何需要这么做?

mke2fs $DEVICE                # 在RAM设备上创建一个ext2文件系统.

mount $DEVICE $MOUNTPT        # 挂载设备.

chmod 777 $MOUNTPT            # 使普通用户也可以存取这个ramdisk,但是, 只能由root来缷载它.

echo """$MOUNTPT"" now available for use."

# 现在 ramdisk 即使普通用户也可以用来存取文件了.

# 注意, ramdisk是易失的, 所以当计算机系统重启或关机时ramdisk里的内容会消失.

#

# 重启之后, 运行这个脚本再次建立起一个 ramdisk.

# 仅重新加载 /mnt/ramdisk 而没有其他的步骤将不会正确工作.

# 如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,以使系统启动时能自动设立一个ramdisk。这样很合适速度要求高的数据库服务器.

exit 0

</span>

运行起来效果如下:

<span style="font-size:18px">long@Raring:/tmp$ vim ramdisk.sh

long@Raring:/tmp$ chmod +x ramdisk.sh

long@Raring:/tmp$ ./ramdisk.sh

Must be root to run ramdisk.sh.

long@Raring:/tmp$ sudo ./ramdisk.sh

记录了2000+0 的读入

记录了2000+0 的写出

2048000字节(2.0 MB)已复制,0.0113732 秒,180 MB/秒

mke2fs 1.42.8 (20-Jun-2013)

Discarding device blocks: 完成

文件系统标签=

OS type: Linux

块大小=1024 (log=0)

分块大小=1024 (log=0)

Stride=0 blocks, Stripe width=0 blocks

16384 inodes, 65536 blocks

3276 blocks (5.00%) reserved for the super user

第一个数据块=1

Maximum filesystem blocks=67108864

8 block groups

8192 blocks per group, 8192 fragments per group

2048 inodes per group

Superblock backups stored on blocks:

    8193, 24577, 40961, 57345

Allocating group tables: 完成

正在写入inode表: 完成

Writing superblocks and filesystem accounting information: 完成

/mnt/ramdisk now available for use.</span>

最后值得一提的是,ELF二进制文件利用了/dev/zero。

————————————————

版权声明:本文为CSDN博主「i龙家小少」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/longerzone/article/details/12948925

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容