_dup
, _dup2
Membuat pendeskripsi file kedua untuk file terbuka (_dup
), atau menetapkan ulang pendeskripsi file (_dup2
).
Sintaks
int _dup( int fd );
int _dup2( int fd1, int fd2 );
Parameter
fd
, fd1
Deskriptor file yang merujuk ke file terbuka.
fd2
Setiap pendeskripsi file.
Nilai hasil
_dup
mengembalikan pendeskripsi file baru. _dup2
mengembalikan 0 untuk menunjukkan keberhasilan. Jika terjadi kesalahan, setiap fungsi mengembalikan -1 dan diatur errno
ke EBADF
jika deskriptor file tidak valid, atau jika EMFILE
tidak ada lagi deskriptor file yang tersedia. Ketika melewati deskriptor file yang tidak valid, fungsi juga memanggil handler parameter yang tidak valid, seperti yang dijelaskan dalam Validasi parameter.
Untuk informasi selengkapnya tentang kode pengembalian, lihat errno
, , _doserrno
_sys_errlist
, dan _sys_nerr
.
Keterangan
Fungsi _dup
dan _dup2
mengaitkan deskriptor file kedua dengan file yang saat ini terbuka. Fungsi-fungsi ini dapat digunakan untuk mengaitkan deskriptor file yang telah ditentukan sebelumnya, seperti untuk stdout
, dengan file yang berbeda. Operasi pada file dapat dilakukan menggunakan pendeskripsi file. Jenis akses yang diizinkan untuk file tidak terpengaruh oleh pembuatan deskriptor baru. _dup
mengembalikan pendeskripsi file berikutnya yang tersedia untuk file yang diberikan. _dup2
fd2
memaksa untuk merujuk ke file yang sama dengan fd1
. Jika fd2
dikaitkan dengan file terbuka pada saat panggilan, file tersebut ditutup.
Baik _dup
dan _dup2
terima deskriptor file sebagai parameter. Untuk meneruskan aliran (FILE *
) ke salah satu fungsi ini, gunakan _fileno
. Rutinitas fileno
mengembalikan pendeskripsi file yang saat ini terkait dengan aliran yang diberikan. Contoh berikut menunjukkan cara mengaitkan stderr
(didefinisikan sebagai FILE *
dalam stdio.h
) dengan pendeskripsi file:
int cstderr = _dup( _fileno( stderr ));
Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.
Persyaratan
Rutin | Header yang diperlukan |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
Konsol tidak didukung di aplikasi Platform Windows Universal (UWP). Handel aliran standar yang terkait dengan konsol, , stdin
, stdout
dan stderr
, harus dialihkan sebelum fungsi run-time C dapat menggunakannya di aplikasi UWP. Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.
Contoh
// 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'