zoukankan      html  css  js  c++  java
  • /dev/zero和/dev/null的区别

    • 摘要:linux文件系统下/dev/null与/dev/zero的区别。

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

    禁止标准输出.    1 cat $filename >/dev/null
       2 # 文件内容丢失,而不会输出到标准输出.
     


    禁止标准错误 (来自例子 12-3).    1 rm $badname 2>/dev/null
       2 #           这样错误信息[标准错误]就被丢到太平洋去了.
     


    禁止标准输出和标准错误的输出.    1 cat $filename 2>/dev/null >/dev/null
       2 # 如果"$filename"不存在,将不会有任何错误信息提示.
       3 # 如果"$filename"存在, 文件的内容不会打印到标准输出.
       4 # 因此Therefore, 上面的代码根本不会输出任何信息.
       5 #
       6 #  当只想测试命令的退出码而不想有任何输出时非常有用。
       7 #
       8 #
       9 # cat $filename &>/dev/null
      10 #     也可以, 由 Baris Cicek 指出.
     


    Deleting contents of a file, but preserving the file itself, with all attendant permissions (from Example 2-1 and Example 2-3):    1 cat /dev/null > /var/log/messages
       2 #  : > /var/log/messages   有同样的效果, 但不会产生新的进程.(因为:是内建的)
       3
       4 cat /dev/null > /var/log/wtmp
     


    自动清空日志文件的内容 (特别适合处理这些由商业Web站点发送的讨厌的"cookies"):


    --------------------------------------------------------------------------------

    例子 28-1. 隐藏cookie而不再使用

       1 if [ -f ~/.netscape/cookies ]  # 如果存在则删除.
       2 then
       3   rm -f ~/.netscape/cookies
       4 fi
       5
       6 ln -s /dev/null ~/.netscape/cookies
       7 # 现在所有的cookies都会丢入黑洞而不会保存在磁盘上了.
     

    --------------------------------------------------------------------------------

    使用/dev/zero
    像/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的). 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到. /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件.


    --------------------------------------------------------------------------------

    例子 28-2. 用/dev/zero创建一个交换临时文件

       1 #!/bin/bash
       2 # 创建一个交换文件.
       3
       4 ROOT_UID=0         # Root 用户的 $UID 是 0.
       5 E_WRONG_USER=65    # 不是 root?
       6
       7 FILE=/swap
       8 BLOCKSIZE=1024
       9 MINBLOCKS=40
      10 SUCCESS=0
      11
      12
      13 # 这个脚本必须用root来运行.
      14 if [ "$UID" -ne "$ROOT_UID" ]
      15 then
      16   echo; echo "You must be root to run this script."; echo
      17   exit $E_WRONG_USER
      18 fi 
      19  
      20
      21 blocks=${1:-$MINBLOCKS}          #  如果命令行没有指定,
      22                                  #+ 则设置为默认的40块.
      23 # 上面这句等同如:
      24 # --------------------------------------------------
      25 # if [ -n "$1" ]
      26 # then
      27 #   blocks=$1
      28 # else
      29 #   blocks=$MINBLOCKS
      30 # fi
      31 # --------------------------------------------------
      32
      33
      34 if [ "$blocks" -lt $MINBLOCKS ]
      35 then
      36   blocks=$MINBLOCKS              # 最少要有 40 个块长.
      37 fi 
      38
      39
      40 echo "Creating swap file of size $blocks blocks (KB)."
      41 dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks  # 把零写入文件.
      42
      43 mkswap $FILE $blocks             # 将此文件建为交换文件(或称交换分区).
      44 swapon $FILE                     # 激活交换文件.
      45
      46 echo "Swap file created and activated."
      47
      48 exit $SUCCESS
     

    --------------------------------------------------------------------------------

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


    --------------------------------------------------------------------------------

    例子 28-3. 创建ramdisk

       1 #!/bin/bash
       2 # ramdisk.sh
       3
       4 #  "ramdisk"是系统RAM内存的一段,
       5 #+ 它可以被当成是一个文件系统来操作.
       6 #  它的优点是存取速度非常快 (包括读和写).
       7 #  缺点: 易失性, 当计算机重启或关机时会丢失数据.
       8 #+       会减少系统可用的RAM.
       9 #
      10 #  那么ramdisk有什么作用呢?
      11 #  保存一个较大的数据集在ramdisk, 比如一张表或字典,
      12 #+ 这样可以加速数据查询, 因为在内存里查找比在磁盘里查找快得多.
      13
      14
      15 E_NON_ROOT_USER=70             # 必须用root来运行.
      16 ROOTUSER_NAME=root
      17
      18 MOUNTPT=/mnt/ramdisk
      19 SIZE=2000                      # 2K 个块 (可以合适的做修改)
      20 BLOCKSIZE=1024                 # 每块有1K (1024 byte) 的大小
      21 DEVICE=/dev/ram0               # 第一个 ram 设备
      22
      23 username=`id -nu`
      24 if [ "$username" != "$ROOTUSER_NAME" ]
      25 then
      26   echo "Must be root to run ""`basename $0`""."
      27   exit $E_NON_ROOT_USER
      28 fi
      29
      30 if [ ! -d "$MOUNTPT" ]         #  测试挂载点是否已经存在了,
      31 then                           #+ 如果这个脚本已经运行了好几次了就不会再建这个目录了
      32   mkdir $MOUNTPT               #+ 因为前面已经建立了.
      33 fi
      34
      35 dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE  # 把RAM设备的内容用零填充.
      36                                                       # 为何需要这么做?
      37 mke2fs $DEVICE                 # 在RAM设备上创建一个ext2文件系统.
      38 mount $DEVICE $MOUNTPT         # 挂载设备.
      39 chmod 777 $MOUNTPT             # 使普通用户也可以存取这个ramdisk.
      40                                # 但是, 只能由root来缷载它.
      41
      42 echo """$MOUNTPT"" now available for use."
      43 # 现在 ramdisk 即使普通用户也可以用来存取文件了.
      44
      45 #  注意, ramdisk是易失的, 所以当计算机系统重启或关机时ramdisk里的内容会消失.
      46 #
      47 #  拷贝所有你想保存文件到一个常规的磁盘目录下.
      48
      49 # 重启之后, 运行这个脚本再次建立起一个 ramdisk.
      50 # 仅重新加载 /mnt/ramdisk 而没有其他的步骤将不会正确工作.
      51
      52 #  如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,
      53 #+ 以使系统启动时能自动设立一个ramdisk.
      54 #  这样很合适速度要求高的数据库服务器.
      55
      56 exit 0
     

    --------------------------------------------------------------------------------

    最后值得一提的是, ELF二进制文件利用了/dev/zero.
  • 相关阅读:
    SQLite Select语句的意外发现
    和一个经理人谈话的经典语句
    [转]如何动态增长一个数组的大小
    [转]Spring AOP中文教程
    为Wildfish框架增加方法调用日志[Aspectsharp]
    第四周学习心得
    《大道至简:软件工程实践者的思想》观后感
    第三周学习心得
    暑假第一周Java学习心得
    第二周学习心得
  • 原文地址:https://www.cnblogs.com/pony/p/1393172.html
Copyright © 2011-2022 走看看