int dup2(int oldfd,int newfd);
功能:将oldfd 重定向到 newfd标识的文件 对newfd文件符操作就是对 oldfd文件符操 作。
函数测试:
例子:(在 dup2.dat 文件中获得输入的数据 命令:gcc dup2Test.c -o dup2Test ./dup2Test jkjkkk)
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define filename "dup2.dat"
int main(int argc,char *argv[])
{
int fileFd = 0;
int ret = 0;
int oldstdout = 0;
int newstdout = 0;
pid_t forkFd = 0;
fileFd = open(filename,O_CREAT|O_RDWR|O_APPEND);
printf("fileFd=%d\n",fileFd);
forkFd = fork();
if(forkFd < 0 )
{
printf("error in fork!");
}
else if(forkFd == 0)
{
sleep(5);
printf("子进程\n");
printf("STDOUT_FILENO=%d\n",STDOUT_FILENO);
ret = write(STDOUT_FILENO,argv[1],20);
if(ret < 0)
{
printf("write ret=%d\n",ret);
}
}
else
{
printf("父进程\n");
oldstdout = dup(STDOUT_FILENO);
printf("STDOUT_FILENO1=%d,oldstdout=%d\n",STDOUT_FILENO,oldstdout);
newstdout=dup2(fileFd,STDOUT_FILENO);
printf("STDOUT_FILENO2=%d,newstdout=%d\n",STDOUT_FILENO,newstdout);
close(fileFd);
ret = write(STDOUT_FILENO,argv[1],20);
if(ret < 0)
{
printf("write ret=%d\n",ret);
}
printf("end of father \n");
// dup2(oldstdout,newstdout); 恢复原本的设置
//ret = write(STDOUT_FILENO,argv[1],20);
// printf("test printf is right\n");
}
return 0;
}
要点分析:
重定向完了之后:
(重要:重定向不是 index<索引号>的改变,而是所指向文件指针的改变(索引号仅仅只是个数字,并没有确切的指向地址),索引号还是原来的号码,但是指向的地址已经改变)