函数原型:
#include<unistd.h>
int dup(int oldfd);返回值:若成功,返回新的文件描述符;若出错,返回-1
参数:
- oldfd:要复制的文件描述符
- dup调用成功:有两个文件描述符指向同一个文件
- 返回值:取最小的且没被占用的文件描述符
函数原型:
#include<unistd.h>
int dup2(int oldfd, int newfd);
分析:
- 假设newfd已经指向一个文件,首先断开close与那个文件的连接,newfd指向oldfd指向的文件。(文件描述符重定向)
- 假设调用函数dup2前oldfd与newfd指向同一个文件,调用函数什么也不做。
- 假设newfd没被占用,newfd指向oldfd指向的文件。
测试代码:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>int main()
{int fd = open("temp", O_RDWR | O_CREAT, 0664);if(fd == -1) {perror("open");exit(1);}int fd2 = dup(fd);char *p = "编程让世界更美好编程让世界更美好编程让世界更美好";write(fd2, p, strlen(p));close(fd2);char buf[1024];lseek(fd, 0, SEEK_SET);read(fd, buf, sizeof(buf));printf(" buf = %s\n", buf);close(fd);return 0;
}
输出结果:
测试代码:
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>int main()
{int fd = open("temp", O_RDWR | O_CREAT | O_APPEND, 0664);if(fd == -1) {perror("open");exit(1);}int fd2 = open("temp1", O_RDWR | O_CREAT | O_APPEND, 0664);if(fd2 == -1) {perror("open");exit(1);}dup2(fd, fd2);char *p = "apue还有好多要看,心累啊aa";write(fd2, p, strlen(p));close(fd2);char buf[1024];lseek(fd, 0, SEEK_SET);read(fd, buf, sizeof(buf));printf(" buf = %s\n", buf);close(fd);return 0;
}
输出结果: