1

我正在实施dupdup2使用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 更加高效和线程安全呢?

4

0 回答 0