dup与dup2

dup和dup2
函数原型
int fds = dup(oldfds);
int fds = dup(oldfds,newfds);
dup函数,复制oldfds至fds,dup2赋值oldfds至newfds(也可以说是将newfds<已打开>重定向到oldfds),如果newfds以打开,则会关闭newfds,如果newfds等于oldfds,则直接返回newfds。

close(fds)
fds = dup(oldfds);

fds = dup2(oldfds,fds);

//下面介绍一个例子
int main()
{
   fprintf(stdout,"test start /n");
   fflush(stderr);
  
   //保存stdout到fds
   int fds = dup(stdout);
   FILE* fp = fopen("error.log","w+b");
   if(fp == NULL)
   {
       fprintf(stdoutr,"fopen error.log error /n");
       fflush(stdout);
       return -1; 
   }

   //将stderr重定向到文件fp所对应的文件描述符
   int newfds;
   if( (newfds = dup2(fileno(fp),stderr)) < 0 )
   {
       fprintf(stdout,"dup2 failed /n");
       fflush(stdout);
   }
    
   fprintf(stdout,"this is a test /n");
   fflush(stdout);
 
   //恢复重定向输出
   if(dup2(fds,newfds) < 0)
   {
      fprintf(stdout,"dup2 failed /n");
   }
 
   fprintf(stdout,"test is over /n");
     
}
如果没有错误发生,则程序运行后屏幕上出现的则是
:test start
 test is over
error.log文件里则是this is a test

你可能感兴趣的:(C/C++,linux)