dup()函數
函數功能:
複制檔案描述符;
函數原型
int dup(int oldfd);
oldfd --需要複制的檔案描述符;
函數傳回值
成功:傳回最小且沒有被占用的檔案描述符;
失敗:傳回-1,設定error;
//測試dup函數複制檔案描述符
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
//打開檔案
int fd = open(argv[1], O_RDWR);
if(fd<0)
{
perror("open error");
return -1;
}
//調用dup函數複制fd
int newfd = dup(fd);
printf("newfd:[%d], fd:[%d]\n", newfd, fd);
//使用fd對檔案進行寫操作
write(fd, "hello world", strlen("hello world"));
//調用lseek函數移動檔案指針到開始處
lseek(fd, 0, SEEK_SET);
//使用newfd讀檔案
char buf[64];
memset(buf, 0x00, sizeof(buf));//将數組初始化;
int n = read(newfd, buf, sizeof(buf));
printf("read over: n==[%d], buf==[%s]\n", n, buf);
//關閉檔案
close(fd);
close(newfd);
return 0;
}
[注]
當調用dup函數之後,newfd和fd都指向了同一個檔案,核心會在内部維護一個計數,此時計數位2,當close一個檔案描述符之後,這個計數變為1,隻有當計數為0時,檔案才會被真正關閉。
驗證方法:通過fd對檔案進行寫操作,通過newfd對檔案進行讀操作。若讀到檔案記憶體則認定指向了相同檔案。
dup2()函數
函數功能:
複制檔案描述符;
函數原型
int dup2(int oldfd,int newfd);
oldfd --需要複制的檔案描述符;
newfd --複制成的新的檔案描述符
函數傳回值
成功:将oldfd複制給newfd, 兩個檔案描述符指向同一個檔案;
失敗:傳回-1,設定error;
[注]:
假設newfd已經指向了一個檔案,首先close原來打開的檔案,然後newfd指向oldfd指向的檔案.
若newfd沒有被占用,newfd指向oldfd指向的檔案.