DUP和DUP2程序。我不明白它是如何工作的

时间:2018-10-28 18:00:40

标签: c linux unix system-calls

我不明白这段代码是如何工作的。该程序必须仅使用getchar和putchar将FILE1的文本复制到FILE2。我最不了解的部分是从程序开始到结束。在第一行中,基本上它以读取模式打开第一个文件,并创建第二个文件进行读取和写入。然后将fdin指向in,将fdout指向out。然后,它将0分配给dupin,将1分配给dupout,我不知道为什么将它以某种方式将第一个文件的文本传递给另一个文件,并且还在FILE2上写入“复制终止”。你能解释一下吗?

 #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>


int main()
{

  int  fdin, fdout, dupin, dupout, c;
  FILE *in, *out;

  in=fopen("FILE1","r");
  out=fopen("FILE2","w+");
  fdin=fileno(in);
  fdout=fileno(out);


  if((dupin=dup2(fdin,STDIN_FILENO))<0) 
    printf("dupin error\n");            

  if((dupout=dup2(fdout,STDOUT_FILENO))<0)   
    printf("dupout error\n");               

  while ( (c=getchar()) != EOF) 
          putchar(c); 


printf("Copy terminated\n");
  exit(0);
}

1 个答案:

答案 0 :(得分:0)

可以使用freopen();它是为此背景设计的。

但是,此代码中的第一个dup2()调用使stdin流下的文件描述符(文件描述符STDIN_FILENO或0)引用了{{1}下的文件描述符}文件流。此后,当您从in阅读时,它来自stdin

类似地,第二个FILE1调用使dup2()流下的文件描述符(文件描述符stdoutSTDOUT_FILENO)引用了{{1 }}文件流。之后,当您写入1时,它将转到out

如果代码在stdout调用之后还尝试从FILE2in读取,则存在混淆的风险。使用out可以避免这种情况。 即使退出,您也不会关闭dup2()freopen()。通常,最好关闭已打开的内容。由in执行的代码(在out返回时被调用)确实关闭 all 打开的文件流。原则上,您可以在exit()调用之后立即关闭main()in-不再需要它们。

另一种更好的替代方法是使用outdup2()(使用getc(in)的好方法)—除非问题规则似乎禁止这样做,否则显然编程练习。