/dev/zero

{{Confuse|Null device}}

{{Short description|Special file in Unix-like operating systems}}

{{Use dmy dates|date=February 2020|cs1-dates=y}}

{{mono|/dev/zero}} is a special file in Unix-like operating systems that provides as many null characters (ASCII NUL, 0x00) as are read from it.{{citation|title=Advanced Linux Programming|first1=Mark|last1=Mitchell|first2=Jeffrey|last2=Oldham|first3=Alex|last3=Samuel|publisher=Sams Publishing|year=2001|isbn=9780735710436|url=https://books.google.com/books?id=oRqqAVyXjwAC&pg=PA136|contribution=6.5.2 /dev/zero|page=136}} One of the typical uses is to provide a character stream for initializing data storage.{{citation|title=Linux System Programming: Talking Directly to the Kernel and C Library|first=Robert|last=Love|publisher=O'Reilly Media, Inc.|year=2007|isbn=9780596009588|url=https://books.google.com/books?id=k_ocKY0iegsC&pg=PA259|contribution=Mapping /dev/zero|pages=259–260}}

Function

Read operations from {{mono|/dev/zero}} return as many null characters (0x00) as requested in the read operation.

Unlike {{mono|/dev/null}}, {{mono|/dev/zero}} may be used as a source, not only as a sink for data. All write operations to {{mono|/dev/zero}} succeed with no other effects. However, {{mono|/dev/null}} is more commonly used for this purpose.

When {{mono|/dev/zero}} is memory-mapped, e.g., with mmap, to the virtual address space, it is equivalent to using anonymous memory; i.e. memory not connected to any file.

History

{{mono|/dev/zero}} was introduced in 1988 by SunOS-4.0 in order to allow a mappable BSS segment for shared libraries using anonymous memory.{{cite web |title="C" run-time program bootstrap from SunOS, contributed to CSRG for inclusion in 4.4BSD |url=https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/src/contrib/sun.sharedlib/lib/csu/m68k/crt0.s |website=TUHS}} HP-UX 8.x introduced the MAP_ANONYMOUS flag for mmap(), which maps anonymous memory directly without a need to open {{mono|/dev/zero}}.{{cite web |title=HP-UX 8.0.7 install media |date=22 July 1992 |url=https://archive.org/details/hp-ux8.07forhp9000s7xx}} Since the late 1990s, MAP_ANONYMOUS{{cite web |last1=Beal |first1=Chris |title=So what the heck is anonymous memory |url=https://blogs.oracle.com/cwb/so-what-the-heck-is-anonymous-memory |website=Oracle Blog |access-date=2019-09-09 |archive-date=2021-04-15 |archive-url=https://web.archive.org/web/20210415103111/https://blogs.oracle.com/cwb/so-what-the-heck-is-anonymous-memory |url-status=dead }} or MAP_ANON are supported by most UNIX versions, removing the original purpose of {{mono|/dev/zero}}.{{cite web |title=MAP_ANON description in mmap(2) |url=https://netbsd.gw.com/cgi-bin/man-cgi?mmap |website=NetBSD |access-date=2019-09-09 |archive-date=2019-11-25 |archive-url=https://web.archive.org/web/20191125152633/https://netbsd.gw.com/cgi-bin/man-cgi?mmap |url-status=dead }}

Examples

Erasing a file system partition or drive:

cp /dev/zero /dev/

(Note that this does not perform a secure erasure, may not destroy the data at all, and may take significantly more time than required – for this purpose, domain-specific tooling like blkdiscard may be preferred for devices that support TRIM.)

Creating a 1 MiB file, called foobar, filled with null characters:

head -c $(( 1024 * 1024 )) /dev/zero > foobar

Instead of creating a file really filled with only zero bytes, many file systems also support the creation of sparse files, which return zeros upon reading but use less actual space. The classic way of doing this (without the domain-specific truncate utility) would be, to create a 1 GiB file:

dd {{abbr|bs|block size}}=1 seek=$(( 1024 * 1024 * 1024 - 1 )) count=1 < /dev/zero > foobar

which seeks to position seek·bs=1GiB−1 in the output and copies count·bs=1 byte from /dev/zero, thus making the file contain only one data block.

See also

References

{{Reflist}}

{{DEFAULTSORT:Dev Zero}}

Category:Unix file system technology

Category:Device file