使用fcntl实现dup和dup2

时间:2014-06-15 12:25:40

标签: c linux multithreading call fcntl

我使用dup实施dup2fcntl,即我编码的内容:

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

0 个答案:

没有答案