Aracılığıyla paylaş


_dup, _dup2

Açık bir dosya () için ikinci bir dosya_dup tanımlayıcısı oluşturur veya bir dosya tanımlayıcısını (_dup2 ) yeniden atayın.

Sözdizimi

int _dup( int fd );
int _dup2( int fd1, int fd2 );

Parametreler

fd, fd1
Açık dosyaya başvuran dosya tanımlayıcıları.

fd2
Herhangi bir dosya tanımlayıcısı.

Dönüş değeri

_dup yeni bir dosya tanımlayıcısı döndürür. _dup2 başarıyı göstermek için 0 döndürür. Hata oluşursa, her işlev -1 döndürür ve dosya tanımlayıcısı geçersizse veya EMFILE başka dosya tanımlayıcısı yoksa olarak ayarlanır.errno EBADF Geçersiz bir dosya tanımlayıcısı geçirildiğinde işlev, Parametre doğrulama bölümünde açıklandığı gibi geçersiz parametre işleyicisini de çağırır.

İade kodları hakkında daha fazla bilgi için bkz. errno, _doserrno, _sys_errlistve _sys_nerr.

Açıklamalar

_dup ve _dup2 işlevleri, ikinci bir dosya tanımlayıcısını şu anda açık olan bir dosyayla ilişkilendirir. Bu işlevler, için gibi önceden tanımlanmış bir dosya tanımlayıcısını farklı bir dosyayla ilişkilendirmek için stdoutkullanılabilir. Dosyadaki işlemler dosya tanımlayıcısı kullanılarak gerçekleştirilebilir. Dosya için izin verilen erişim türü, yeni bir tanımlayıcı oluşturulmasından etkilenmez. _dup verilen dosya için bir sonraki kullanılabilir dosya tanımlayıcısını döndürür. _dup2ile aynı dosyaya fd1başvurmaya zorlarfd2. Çağrı sırasında açık bir dosyayla ilişkiliyse fd2 , bu dosya kapatılır.

_dup2 Hem hem de _dup dosya tanımlayıcılarını parametre olarak kabul edin. Bu işlevlerden herhangi biri için bir akış (FILE *) geçirmek için kullanın _fileno. Yordam, fileno şu anda verilen akışla ilişkili dosya tanımlayıcısını döndürür. Aşağıdaki örnek, bir dosya tanımlayıcısı ile nasıl ilişkilendirilmeyi stderr (içinde stdio.holarak FILE * tanımlanır) gösterir:

int cstderr = _dup( _fileno( stderr ));

Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bu davranışı değiştirmek için bkz. CRT'de Genel durum.

Gereksinimler

Yordam Gerekli başlık
_dup <io.h>
_dup2 <io.h>

Konsol Evrensel Windows Platformu (UWP) uygulamalarında desteklenmez. C çalışma zamanı işlevlerinin UWP uygulamalarında kullanabilmesi için önce konsolu stdin, , stdoutve stderrile ilişkilendirilmiş standart akış tanıtıcılarının yeniden yönlendirilmesi gerekir. Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Örnek

// crt_dup.c
// This program uses the variable old to save
// the original stdout. It then opens a new file named
// DataFile and forces stdout to refer to it. Finally, it
// restores stdout to its original state.

#include <io.h>
#include <stdlib.h>
#include <stdio.h>

int main( void )
{
   int old;
   FILE *DataFile;

   old = _dup( 1 );   // "old" now refers to "stdout"
                      // Note:  file descriptor 1 == "stdout"
   if( old == -1 )
   {
      perror( "_dup( 1 ) failure" );
      exit( 1 );
   }
   _write( old, "This goes to stdout first\n", 26 );
   if( fopen_s( &DataFile, "data", "w" ) != 0 )
   {
      puts( "Can't open file 'data'\n" );
      exit( 1 );
   }

   // stdout now refers to file "data"
   if( -1 == _dup2( _fileno( DataFile ), 1 ) )
   {
      perror( "Can't _dup2 stdout" );
      exit( 1 );
   }
   puts( "This goes to file 'data'\n" );

   // Flush stdout stream buffer so it goes to correct file
   fflush( stdout );
   fclose( DataFile );

   // Restore original stdout
   _dup2( old, 1 );
   puts( "This goes to stdout\n" );
   puts( "The file 'data' contains:" );
   _flushall();
   system( "type data" );
}
This goes to stdout first
This goes to stdout

The file 'data' contains:
This goes to file 'data'

Ayrıca bkz.

Alt düzey G/Ç
_close
_creat, _wcreat
_open, _wopen