5,dup,dup2 复制一个现存的文件描述符
int dup2(int filedes, int filedes2) from oldfd to newfd用已有描述符覆盖另一描述符
//-------------dup2.c----------------
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "ourhdr.h"
#include "err_error.h"
main()
{
int fd;
if((fd=open("123",O_RDWR))==-1)
err_sys("open error");
if(dup2(fd,STDOUT_FILENO)==-1)
err_sys("dup2 error");
printf("/nWhere is those words?/n");
//猜猜会不会在屏幕上输出
close(fd);
}
//---------------end-------------------
king@king-laptop:~/blog$ gcc -o dup2 dup2.c
king@king-laptop:~/blog$ ./dup2
king@king-laptop:~/blog$ cat 123
Where is those words?
emptyking@king-laptop:~/blog$
这是怎么回事?
在进程中的文件描述符指向内核中的文件表,内核中的文件表指向文件(设备)。
在例子中,STDOUT_FILENO指向的是显示器设备,fd指向的是硬盘里的文件123
调用dup2后fd覆盖了STDOUT_FILENO,使STDOUT_FILENO指向了硬盘里的文件123
系统默认的基本输出描述符就是STDOUT_FILENO,STDOUT_FILENO将printf引向了一个硬盘文件123上。
dup是生成一个文件描述符,原理相同,不再累述
在给一个例子,大家体会体会吧^_^
//------------------------重定向功能的实现----------------------------
#include "ourhdr.h"
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd,stdfd,desfd;
char buffer[15]="Hello world!";
stdfd=dup(STDOUT_FILENO);//保存基本输出设备
//---------------------------------------------------------------------------
fd=open("datafile",O_WRONLY | O_CREAT | O_TRUNC, 0666);
desfd=dup2(fd,STDOUT_FILENO);//本进程的文件描述符ffd和STDOUT_FILENO都指向了fd的文件表项也就是他们指向了同一个设备(STDOUT_FILENO不再指向显示器)
write(STDOUT_FILENO,buffer,12);
//---------------------------------------------------------------------------
//还原基本输出设备
dup2(stdfd,STDOUT_FILENO);
printf("stdout device!/n");
}
//---------------------------end-----------------------------