admin管理员组文章数量:1593070
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比
分类: Linux 内核知识学习/总结 2013-10-22 17:00 279人阅读 评论(0) 收藏 举报 Linux devnull devzero目录(?)[+]
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"存在, 文件的内容不会打印到标准输出。* 因此, 上面的代码根本不会输出任何信息,当只想测试命令的退出码而不想有任何输出时非常有用。
当然,使用 cat $filename &>/dev/null 也可以达到 cat $filename 2>/dev/null >/dev/null 一样的效果。
[plain] view plain copy- <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
[plain] view plain copy
- <span style="font-size:18px"> if [ -f ~/scape/cookies ] # 如果存在则删除,删除后才可以添加软链接
- then
- rm -f ~/scape/cookies
- fi
- ln -s /dev/null ~/scape/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创建一个交换临时文件
[plain] view plain copy
- <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>
运行效果我们可以看到:
[plain] view plain copy- <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
[plain] view plain copy
- <span style="font-size:18px">#!/bin/bash
- # ramdisk.sh
- # "ramdisk"是系统RAM内存的一段,它可以被当成是一个文件系统来操作.
版权声明:本文标题:Linux 下的两个特殊的文件devnull 和 devzero 简介及对比 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728153303a1147480.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论