std*
介绍
在 Linux 中,每个进程都有三个默认的 I/O 流,分别是标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)。这三个流都通过文件描述符来引用,文件描述符是一个非负整数,用于标识打开的文件或其他 I/O 流。
下面是有关每个文件描述符的详细信息:
- 标准输入(stdin):它的文件描述符是 0。在默认情况下,它从终端读取输入。可以使用
read
命令从 stdin 读取输入,例如:read variable_name
。 - 标准输出(stdout):它的文件描述符是 1。在默认情况下,它向终端输出。可以使用
echo
命令向 stdout 输出内容,例如:echo "Hello, World!"
。 - 标准错误输出(stderr):它的文件描述符是 2。在默认情况下,它也向终端输出。可以使用
echo
命令向 stderr 输出内容,例如:echo "Error: file not found" >&2
。
文件描述符还可以用于引用其他打开的文件或管道。例如,如果你想将命令的输出重定向到文件中,可以使用文件描述符 1 来引用文件。例如,下面的命令将 ls
命令的输出重定向到名为 filelist.txt
的文件中:
ls > filelist.txt
在这个命令中,>
符号将文件描述符 1(即标准输出)重定向到名为 filelist.txt
的文件中。
总之,标准输入、标准输出和标准错误输出是 Linux 中非常重要的概念,文件描述符是引用它们的机制。理解它们的概念和如何使用它们将有助于你更好地理解和掌握 Linux 命令行。
实例
[root@localhost dev]# ls -al std*
lrwxrwxrwx. 1 root root 15 3月 23 10:39 stderr -> /proc/self/fd/2 #软连接
lrwxrwxrwx. 1 root root 15 3月 23 10:39 stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 3月 23 10:39 stdout -> /proc/self/fd/1
[root@localhost dev]# ls /proc/self/fd/2
/proc/self/fd/2
[root@localhost dev]# ls -al /proc/self/fd/2
lrwx------. 1 root root 64 3月 27 10:29 /proc/self/fd/2 -> /dev/pts/1 #软连接
[root@localhost dev]# ls -al /dev/pts/1
crw--w----. 1 root tty 136, 1 3月 27 10:29 /dev/pts/1
[root@localhost dev]# hello
-
标准输入 --》fd0
-
标准输出 --》fd1
-
标准错误输出 --》fd2
文件描述符
文件描述符是 Linux 中一个非常重要的概念,它允许进程通过标准输入、标准输出和标准错误输出进行输入和输出操作,或者通过其他文件或管道进行交互。
在 Linux 中,文件描述符是一种非负整数,用于标识打开的文件或其他 I/O 流。每个打开的文件都有一个与之关联的文件描述符,可以使用该文件描述符来读取或写入该文件。
Linux 中的文件描述符是按照顺序分配的,每个进程都有三个默认的文件描述符:标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)。它们分别由文件描述符 0、1 和 2 引用。例如,你可以使用 ls > file.txt
命令将 ls
命令的输出写入名为 file.txt
的文件中,这里的 >
表示将标准输出重定向到文件中。
除了这三个默认的文件描述符,Linux 中还有其他预定义的文件描述符,例如,文件描述符 3 到 9 是保留的,通常用于特定的目的,如在 shell 脚本中与文件或管道进行交互。文件描述符 10 及以上是未经预定义的,可以自由使用。
在 Linux 中,可以使用以下命令来重定向文件描述符:
>
:用于将标准输出重定向到文件中。>>
:用于将标准输出追加到文件中。<
:用于从文件中读取输入并将其发送到标准输入流中。2>
:用于将标准错误输出重定向到文件中。2>>
:用于将标准错误输出追加到文件中。
除了上述命令外,还可以使用 exec
命令来重定向文件描述符。例如,exec 3< file.txt
命令将文件描述符 3 指向名为 file.txt
的文件。现在,你可以使用 read
命令从文件描述符 3 中读取输入,例如,read line <&3
命令将从文件描述符 3 中读取一行输入。
[root@localhost 4-10]# exec 3< test.txt
[root@localhost 4-10]# read line <&3
[root@localhost 4-10]# echo $line
yandonghao 22 男
此外,还有一些其他的文件描述符操作,如 dup
和 dup2
函数。dup
函数可以复制一个文件描述符,并返回一个新的文件描述符,它指向与原始文件描述符相同的文件或管道。dup2
函数与 dup
函数类似,但它允许你将一个已经打开的文件描述符复制到另一个文件描述符上。
Linux 中的文件描述符是在进程中的每个打开文件的文件表中进行分配和管理的。当进程打开一个文件时,内核为该文件分配一个文件表项,并返回一个文件描述符给进程。进程可以使用这个文件描述符来执行读取、写入、关闭等操作。
当进程启动时,它会自动打开三个文件描述符:标准输入、标准输出和标准错误输出。这些文件描述符分别连接到终端设备或其他的输入/输出设备。
在 Linux 中,文件描述符是通过一组系统调用来管理的,包括 open()、close()、read()、write()、fcntl() 等。进程可以使用这些系统调用来打开、关闭、读取、写入和修改文件描述符。