dup2是Linux下用來實現文件描述符複製的api,dup2(fd1, fd2)將會把fd1複製到指定的fd2下,如果fd2是一個已經打開的描述符,dup2會自動的先將其安靜的關閉。我們知道Linux的進程表中會維護打開的文件表項,複製的作用是使fd2指向了fd1所指向同一個文件。當我們關閉了指向同一個文件的fd的時候,關閉一個fd另外一個fd是不受影響的。下面的例子我們通過把/dev/null複製給標準輸出,讓程序的標準輸出消失掉。
例子
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main() {
printf("befor dup stdout!\n");
int devNullFd = open("/dev/null", O_RDWR);
dup2(devNullFd, STDOUT_FILENO);
printf("after dup stdout!\n");
sleep(30);
close(devNullFd);
const char* testStr = "test";
write(STDOUT_FILENO, testStr, strlen(testStr));
perror("error:");
sleep(10);
close(devNullFd);
write(devNullFd, testStr, strlen(testStr));
perror("error:");
return 0;
}
結果
befor dup stdout!
error:: Success
error:: Bad file descriptor
文件表結構
sudo ls -l /proc/37410/fd
total 0
lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:35 0 -> /dev/pts/6
lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:35 1 -> /dev/null
lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:34 2 -> /dev/pts/6
lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:35 3 -> /dev/null