我使用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更高效和线程安全?