我正在实施dup
和dup2
使用fcntl
,我已经编码:
int dup(int oldfd) {
return fcntl(oldfd, F_DUPFD, STDERR_FILENO);
}
int dup2(int oldfd, int newfd) {
if(oldfd == newfd)
return oldfd;
if(fcntl(oldfd, F_GETFD) == -1)
return -1;
if(close(newfd) == -1 && errno != EBADF)
return -1;
fcntl(oldfd, F_DUPFD, newfd);
return newfd;
}
但是我看到 dup2 根本没有效率(太多的系统调用 ==> 太多的内核模式切换)并且 dup2 不是线程安全的,我可能会发生竞争条件,因为如果在close(newfd)和fcntl之间(oldfd, F_DUPFD, newfd)另一个线程控制并打开一个文件,文件描述符newfd可能会被占用。
那么如何让 dup2 更加高效和线程安全呢?