【Linux除錯技巧----標準輸出重定向到檔案】dup2和dup的妙用
阿新 • • 發佈:2019-01-21
dup
和dup2
都可用來複制一個現存的檔案描述符,使兩個檔案描述符指向同一個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
再複製。
下面這個例子演示了dup
和dup2
函式的用法,請結合後面的連環畫理解程式的執行過程。
#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;
}