_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_errlist
ve _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 stdout
kullanı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. _dup2
ile aynı dosyaya fd1
baş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.h
olarak 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
, , stdout
ve stderr
ile 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'