c-c++-dup
C/C++ dup
- dup() 和 dup2() 是兩個非常有用的系統調用,都是用來複製一個文件的描述符,使新的文件描述符也標識舊的文件描述符所標識的文件。
- 鑰匙相當於文件描述符,鎖相當於文件,本來一個鑰匙開一把鎖,相當於,一個文件描述符對應一個文件,現在,我們去配鑰匙,通過舊的鑰匙複製了一把新的鑰匙,這樣的話,舊的鑰匙和新的鑰匙都能開啟這把鎖
#include <unistd.h>
dup
int dup(int oldfd);
- 通過 oldfd 複製出一個新的文件描述符,新的文件描述符是調用進程文件描述符表中最小可用的文件描述符
- 最終 oldfd 和新的文件描述符都指向同一個文件。
- 新文件描述符編號保證是最小編號,在調用過程中未使用的文件描述符。
dup2
int dup2(int oldfd, int newfd);
- 通過 oldfd 複製出一個新的文件描述符 newfd
- 如果成功,newfd 和函數返回值是同一個返回值,最終 oldfd 和新的文件描述符 newfd 都指向同一個文件。
- newfd: 新的文件描述符,這個描述符可以人為指定一個合法數字(0-1023
int dup3(int oldfd, int newfd, int flags);
- dup3() is the same as dup2(), except that:
- The caller can force the close-on-exec flag to be set for the new file descriptor by specifying O_CLOEXEC in flags.
- See the description of the same flag in open(2) for reasons why this may be useful.
- If oldfd equals newfd, then dup3() fails with the error EINVAL.
return
- On success, these system calls return the new file descriptor.
- On error, -1 is returned, and errno is set to indicate the error.