dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。
如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。
由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。对于dup2,可以用newfd参数指定新描述符的值。如果newfd已经打开,则先将其关闭。如若oldfd等于newfd,则dup2返回newfd,而不关闭它。
用dup和dup2实现重定向代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
int fd, save_fd;
char msg[] = "test file\n";
fd = open("somefile", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd < 0) {
perror("open");
exit(1);
}
save_fd = dup(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO);
close(fd);
write(STDOUT_FILENO, msg, strlen(msg));
dup2(save_fd, STDOUT_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
close(save_fd);
return 0;
}
运行结果:
cat@lenovo:~/Pro/linux_sys/0720/dup2$ ./a.out
test file
cat@lenovo:~/Pro/linux_sys/0720/dup2$ cat somefile
test file
过程分析: