使用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时候,显示关闭成功,但是设备却再也打不开了,因为我并没有真正还原。
备却再也打不开了,因为我并没有真正还原。

浙公网安备 33010602011771号