天天看點

dup()/dup2()函數使用

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指向的檔案.

繼續閱讀