程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> dup and dup2的剖析

dup and dup2的剖析

編輯:關於C語言
 

dupdup2都可用來復制一個現存的文件描述符,使兩個文件描述符指向同一個file結構體。如果兩個文件描述符指向同一個file結構體,File Status Flag和讀寫位置只保存一份在file結構體中,並且file結構體的引用計數是2。如果兩次open同一文件得到兩個文件描述符,則每個描述符對應一個不同的file結構體,可以有不同的File Status Flag和讀寫位置。請注意區分這兩種情況。

#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

如果調用成功,這兩個函數都返回新分配或指定的文件描述符,如果出錯則返回-1。dup返回的新文件描述符一定該進程未使用的最小文件描述符,這一點和open類似。dup2可以用newfd參數指定新描述符的數值。如果newfd當前已經打開,則先將其關閉再做dup2操作,如果oldfd等於newfd,則dup2直接返回newfd而不用先關閉newfd再復制。

下面這個例子演示了dupdup2函數的用法,請結合後面的連環畫理解程序的執行過程。


#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

  int main(void)
{
int fd, save_fd;
char msg[] = "This is a test\n";

fd = open("somefile", O_RDWR|O_CREAT, 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;
}  

重點解釋兩個地方:

  • 第3幅圖,要執行dup2(fd, 1);,文件描述符1原本指向tty,現在要指向新的文件somefile,就把原來的關閉了,但是tty這個文件原本有兩個引用計數,還有文件描述符save_fd也指向它,所以只是將引用計數減1,並不真的關閉文件。

  • 第5幅圖,要執行dup2(save_fd, 1);,文件描述符1原本指向somefile,現在要指向新的文件tty,就把原來的關閉了,somefile原本只有一個引用計數,所以這次減到0,是真的關閉了。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved