dup & dup2
说明:
part.0 :原创
part.1:转载
part.2:转载
part.3:原创
-------------part.0----------------------
int dup(int oldfd);
//创建一个newfd,newfd指向oldfd的位置,并且dup返回的文件描述符总是取系统当前可用的最小整数值
int dup2(int oldfd, intnewfd);
//将已有的一个newfd重定向到oldfd的位置,返回第一个不小于oldfd的整数值
-------------part.1----------------------
链接:http://blog.csdn.net/fucangzxx/article/details/52056215
-------------part.2----------------------
链接:http://blog.csdn.net/kangear/article/details/24098315
代码如下:
- #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时候,显示关闭成功,但是设备却再也打不开了,因为我并没有真正还原。
-------------part.3----------------------
分析:
第一步: newfd(3)=dup( oldfd(1) ); //newfd > oldfd
第二步:newfd(1)=dup2( oldfd(4), newfd(1) );
//newfd > oldfd
第三部:newfd(1)=dup2( oldfd(3), newfd(1) );
//newfd > oldfd