函數原型:
#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;
}
輸出結果:
?