使用dup和dup2重定向

dup函数,dup2()函数
1.dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经

常用来重定向进程的stdin、stdout和stderr。这两个函数的 原形如下:
#include <unistd.h>    
int dup( int oldfd );    
int dup2( int oldfd, int targetfd )

 

 利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一

个新的描述符,这个新的描述符是传给它的描述符的拷贝。

 

dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id

。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的

第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一

个参数指向的文件。下面我们用一段代码加以说明:
int oldfd;   
oldfd = open("app_log", (O_RDWR | O_CREATE), 0644 );    
dup2( oldfd, 1 );    
close( oldfd );

 

举例子:

#include <stdio.h>;  
#include <unistd.h>;  
#include <stdlib.h>;  
#include <fcntl.h>;  
#include <sys/types.h>;  
#include <sys/stat.h>;  
#include <string.h>;  
#include <strings.h>;  
  
int main()  
{  
        int sfd = dup(STDOUT_FILENO), testfd;  
  
        printf("sfd = [%d]\n", sfd);  
  
        testfd = open("./temp",O_CREAT | O_RDWR | O_APPEND);  
        if (-1 == testfd)  
        {  
                printf("open file error.\n");  
                exit(1);  
        }  
  
        /* 重定向 */  
        if (-1 == dup2(testfd,STDOUT_FILENO) ) {  
                printf("can't redirect fd error\n");  
                exit(1);  
        }  
  
        /* 此时向stdout写入应该输出到文件 */  
        write(STDOUT_FILENO,"file\n",5);  
  
        /* 恢复stdout */  
        if (-1 != dup2(sfd,STDOUT_FILENO) ) {  
                printf("recover fd ok \n");  
  
                /* 恢复后,写入stdout应该向屏幕输出 */  
                write(STDOUT_FILENO,"stdout\n",7);  
        }  
  
        printf("gogogogogogo!\n");  
        close(testfd);  
}  

总结:重定向好似抗战片中的将铁轨移到别的路上,或者走向深谷/dev/null,或者走向想让其走的地方fd。再说下,一开始以为我还以为dup2(STDOUT_FILENO, STDOUT_FILENO);就恢复了呢,结果关闭fd时候,显示关闭成功,但是设备却再也打不开了,因为我并没有真正还原。

备却再也打不开了,因为我并没有真正还原。

 

posted @ 2017-06-08 16:30  ren_zhg1992  阅读(630)  评论(0)    收藏  举报