dup 和 dup2 是 Linux 系统调用,用于复制文件描述符。dup 系统调用将给定的文件描述符复制,并返回新的文件描述符。语法为:

int dup(int oldfd);

dup 复制 oldfd 文件描述符,并返回新的文件描述符。新的文件描述符与 oldfd 具有相同的读写权限和偏移量。dup2 系统调用也复制文件描述符,但是它允许你指定新文件的文件描述符。语法为:

int dup2(int oldfd, int newfd);

dup2 将 oldfd 文件描述符复制到 newfd 文件描述符。如果 newfd 已经打开,则先关闭新文件描述符。dup 和 dup2 的主要区别是:

  • dup 返回新的未使用的文件描述符,而 dup2 允许你指定要复制到的文件描述符。
  • 如果指定的文件描述符已经打开,dup2 会先关闭它,然后复制,而 dup 不会。

这两个系统调用通常用于:

  • 重定向标准输入/输出:可以通过 dup2 将文件描述符复制到 stdin(0)、stdout(1) 或 stderr(2)。
  • 实现后台进程:可以先调用 dup 将 stdout 和 stderr 复制,然后关闭原来的 stdout 和 stderr,这样进程就不会再向终端写输出。
  • 实现管道链:可以通过 dup 或 dup2 将多个文件描述符链起来,实现进程间的管道通信。总之,dup 和 dup2 非常有用,是 Linux 编程中重要的系统调用。