_dup
, _dup2
열려 있는 파일(_dup
)에 대한 두 번째 파일 설명자를 만들거나 파일 설명자(_dup2
)를 다시 할당합니다.
구문
int _dup( int fd );
int _dup2( int fd1, int fd2 );
매개 변수
fd
, fd1
열려 있는 파일을 나타내는 파일 설명자입니다.
fd2
모든 파일 설명자입니다.
반환 값
_dup
는 새 파일 설명자를 반환합니다. _dup2
는 성공을 나타내는 0을 반환합니다. 오류가 발생하면 각 함수는 -1을 반환하고 파일 설명자가 잘못된지 또는 EMFILE
더 이상 파일 설명자를 사용할 수 없는지로 설정합니다.errno
EBADF
잘못된 파일 설명자를 전달하면 함수는 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 처리기를 호출합니다.
반환 코드에 대한 자세한 내용은 , , 및 를 참조하세요errno
._sys_nerr
_sys_errlist
_doserrno
설명
_dup
및 _dup2
함수는 두 번째 파일 설명자를 현재 열려 있는 파일과 연결합니다. 이러한 함수는 stdout
과 같은 미리 정의된 파일 설명자를 다른 파일을 연결하는 데 사용할 수 있습니다. 파일 설명자 중 하나를 사용하여 파일 작업을 수행할 수 있습니다. 파일에 허용된 액세스 형식은 새 설명자 만들기의 영향을 받지 않습니다. _dup
는 지정된 파일에 대해 다음으로 사용 가능한 파일 설명자를 반환합니다. _dup2
는 강제로 fd2
가 fd1
과 동일한 파일을 참조하도록 합니다. fd2
가 호출 시 열려 있는 파일과 연결되어 있는 경우 해당 파일이 닫힙니다.
_dup
및 _dup2
둘 다 파일 설명자를 매개 변수로 받습니다. 이러한 함수 중 하나에 스트림(FILE *
)을 _fileno
전달하려면 . fileno
루틴은 지정된 스트림과 현재 연결된 파일 설명자를 반환합니다. 다음 예제에서는 파일 설명자와 연결 stderr
(있는 stdio.h
것처럼 FILE *
정의됨)하는 방법을 보여 줍니다.
int cstderr = _dup( _fileno( stderr ));
기본적으로 이 함수의 전역 상태는 애플리케이션으로 범위가 지정됩니다. 이 동작을 변경하려면 CRT 전역 상태를 참조하세요.
요구 사항
루틴에서 반환된 값 | 필수 헤더 |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
UWP(유니버설 Windows 플랫폼) 앱에서는 콘솔이 지원되지 않습니다. 콘솔에 연결된 표준 스트림 핸들, stdin
, stdout
및 stderr
은 UWP 앱의 C 런타임 함수에서 사용되기 전에 리디렉션되어야 합니다. 호환성에 대한 자세한 내용은 호환성을 참조하세요.
예시
// 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'