欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

输入输出重定向&dup、dup2

程序员文章站 2022-06-24 20:35:21
...

一、输入输出重定向

输入重定向:将文件导入指定命令中
输出重定向:将原本输出打开屏幕上数据信息写入到文件当中

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或者命令中输入
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕

标准输出重定向符号
1“>”将标准输出重定向到指定文件中(清空原有数据)
2“>>”将标准输出重定向到指定文件中(追加到原有数据后面)

下面以>为例
1.首先用touch创建一个空白文件夹readme.txt
2.用运行date>readme.txt 将原本应该显示在屏幕上的内容写入到readme.txt中
输入输出重定向&dup、dup2

二、dup与dup2

dup创建一个文件描述符的副本,但是新的fd(file descriptor)不可以被指定,默认为最小的没有被使用的文件描述符,dup2与dup相同可以创建一个文件描述符的副本,并且可以指定具体的文件描述符。

dup与dup2的函数原型如下:

 int dup(int oldfd);
 int dup2(int oldfd, int newfd);

失败返回-1
成功返回新fd
注意:dup和dup2创建的文件描述符并不继承原fd的属性

案例:
本案例将首先利用open函数打开一个文件,然后利用dup2将STDOUT重定向到打开的文件,然后调用printf,这时printf打印的内容就会输入到打开的文件当中。

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

int main(int argc,char*argv[])
{
  int fd=open("./duptest.txt",O_RDWR|O_CREAT);  //打开一个文件 
  if(fd==-1)
  {
    perror("open error\n");
  }

  int newfd=dup2(fd,STDOUT_FILENO);//将文件描述符STDOUT_FIEN重定向到fd中,这样输出到屏幕的内容就会写入fd指向的文件中
  if(newfd==-1)
  {
    perror("dup2 error\n");
  }

  printf("------输入到屏幕------\n");  //原本应该是打印在屏幕上,但是现在运行程序不会显示在屏幕上,而是写入./duptest.txt这个文件当中

  close(fd);
  return 0;

}

从下图可以看出运行上面代码后屏幕上没有任何输出,但是我们查看duptest.txt这个文件,文件的内容就是原本我们要输出到屏幕上的内容。
输入输出重定向&dup、dup2