Программа DUP и DUP2.Я не могу понять как это работает - PullRequest
0 голосов
/ 28 октября 2018

Я не могу понять, как работает этот код.Эта программа должна скопировать текст FILE1 в FILE2, используя только getchar и putchar.Часть, которую я не понимаю больше всего, от первой до конца программы.В первых строках в основном он открывает первый файл в режиме чтения, он создает второй файл для чтения и записи.Затем он указывает fdin на вход и fdout на выход.Затем он назначает 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 голосов
/ 28 октября 2018

Может использовать freopen();он предназначен для этого контекста.

Однако первый вызов dup2() в этом коде заставляет дескриптор файла, лежащий в основе потока stdin (дескриптор файла STDIN_FILENO или 0), обращатьсяк файловому дескриптору, лежащему в основе файлового потока in.Когда вы читаете из stdin после этого, оно происходит из FILE1.

Аналогично, второй вызов dup2() делает дескриптор файла лежащим в основе потока stdout (дескриптор файла STDOUT_FILENO или 1) обратитесь к файловому дескриптору, лежащему в основе файлового потока out.Когда после этого вы пишете stdout, он переходит к FILE2.

Существует риск путаницы, если код также пытается прочитать из in или out после вызовов dup2().Этого можно избежать с помощью freopen().Вы также не закрываете in или out перед выходом, даже если открыли их.Как правило, это хорошая идея, чтобы явно закрыть то, что вы открыли.Код, выполняемый exit() - который вызывается, когда main() возвращает - закрывает все потоки открытых файлов.В принципе, вы можете закрыть in и out сразу после dup2() звонков - они больше не нужны.

Другой, лучшей альтернативой будет использование getc(in) и putc(c, out) (хорошая работа по использованию int c;) - за исключением того, что, как представляется, это запрещено правилами вопроса, что явно является программированием.

...