一个实际应用的例子:char std_file[PATH_MAX + 1];
FILE
*std_fp;
if((std_fp = fopen("/home/hy/out.std","w+")) == NULL){
do_log(".....\n");exit(6);
}
if(dup2(fileno(std_fp),STDOUT_FILENO) ==
-1){
do_log(".....\n");
fclose(std_fp);
exit(5);
}
if(dup2(fileno(std_fp),STDERR_FILENO) ==
-1){
do_log(".....\n");fclose(std_fp);
exit(5);
}
fclose(std_fp);
execl( EXE_PATH, EXE_NAME, ..... NULL ); //启动命令,省略
在我的实际应用中,因为fork了一个子进程,所以要考虑输出的信息怎样保存到文件中,所以使用了这个。
函数的其他东西可以参考以下资料
----------------------------------------------------------------------------------
#include
int dup( int filedes );
int dup2( int filedes, int filedes2 ); //新文件描述符复制filedes,并且将filedes2值作为新文件描述符的值//dup函数的作用:复制一个现有的句柄,产生一个与“源句柄特性”完全一样的新句柄//
(也即生成一个新的句柄号,并关联到同一个设备,而且它返回的一定是当前可用的//
文件描述符中的最小数值)//dup2函数的作用:复制一个现有的句柄到另一个句柄上,目标句柄的特性与“源句柄特性”
//
完全一样(也即首先关闭目标句柄,与设备断连,接着从源句柄完全拷贝复制到目标句柄)//
这些函数返回的新文件描述符与参数filedes2共享同一个文件表项。
//dup和dup2都是系统服务,window平台对应DuplicateHandle函数
#include
#include
#include
void main( void )
{
int old;
FILE
*new;
old = _dup( 1
);
if( old == -1
)
{
perror( "_dup( 1 ) failure" );
exit( 1 );
}
write( old, "This
goes to stdout first\r\n", 27 );
if( ( new = fopen(
"data", "w" ) ) == NULL )
{
puts( "Can't open file 'data'\n" );
exit( 1 );
}
if( -1 == _dup2(
_fileno( new ), 1 ) )
{
perror( "Can't _dup2 stdout" );
exit( 1 );
}
puts( "This goes to
file 'data'\r\n" );
fflush( stdout
);
fclose( new
);
_dup2( old, 1
);
puts( "This goes to
stdout\n" );
puts( "The file
'data' contains:" );
system( "type data"
);
------------------------------------------------------------------------------------------------------------------------------------