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