📜  什么是标准输出 fd 编号 - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:36:10.817000             🧑  作者: Mango

什么是标准输出 fd 编号 - C 编程语言

在 C 语言中,标准输出是一种常用的输出方式。它通常是指将数据输出到屏幕上或者终端设备上。在 Unix/Linux 系统中,标准输出是通过文件描述符(File Descriptor,简称 fd)来进行管理和操作的。标准输出 fd 编号是 1。

什么是文件描述符

文件描述符(File Descriptor)是 Linux/Unix 操作系统中对文件或 I/O 设备进行访问的抽象句柄。在 Linux/Unix 系统中,一切皆文件,包括磁盘文件、串口、网络套接字、管道等等。

文件描述符是一个非负整数,是内核为了管理文件而维护的一张表的索引,它记录了每个进程打开的文件或设备信息。每个进程都有一张表,记录着该进程打开的文件和设备,文件描述符就是这张表中的索引。

标准输入、标准输出和标准错误

在 Linux/Unix 系统中,标准输入、标准输出和标准错误是三个标准流,它们分别对应文件描述符 0、1、2。

  • 标准输入(stdin):通常指的是从键盘输入的内容,它是一个已经打开的文件,对应的文件描述符是 0。
  • 标准输出(stdout):通常指的是输出到屏幕或终端设备上的内容,它是一个已经打开的文件,对应的文件描述符是 1。
  • 标准错误(stderr):通常指的是输出错误信息的内容,它也是一个已经打开的文件,对应的文件描述符是 2。
标准输出 fd 编号

在 C 语言中,可以使用 printf() 函数输出数据到屏幕上。printf() 函数使用标准输出来输出数据。标准输出 fd 编号是 1。我们也可以通过修改标准输出 fd 来改变数据输出的位置。下面是一个使用 dup() 函数将标准输出重定向到文件的示例代码:

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main() {
    int fd;
    char buf[] = "Hello, world!\n";

    fd = open("output.txt", O_CREAT|O_WRONLY|O_TRUNC, 0644);
    if (fd != 1) {  // 判断文件是否打开成功
        dup2(fd, 1);  // 重定向标准输出到文件中
        close(fd);  // 关闭文件
    }
    printf("%s", buf);  // 输出数据到文件中
    return 0;
}

在上面的代码中,我们首先使用 open() 函数创建文件 output.txt,并以写入方式打开,如果文件打开成功,那么我们就使用 dup2() 函数将标准输出重定向到这个文件中。最后,我们输出数据到标准输出中,由于标准输出已经被重定向到了文件中,因此数据会输出到 output.txt 文件中。

小结
  • 在 Linux/Unix 系统中,一切皆文件,文件描述符是用来访问文件或设备的抽象概念。
  • 标准输入、标准输出和标准错误是三个标准流,它们分别对应文件描述符 0、1、2。
  • 标准输出 fd 编号是 1,可以通过修改标准输出 fd 来改变数据输出的位置。