如何设置文件描述符非阻塞?

时间:2014-12-03 07:52:50

标签: c linux nonblocking epoll

我有两种方法可以设置文件描述符非阻塞。

fcntl(conn_fd, F_SETFD, (fcntl(conn_fd, F_GETFD, 0)|O_NONBLOCK));

 fcntl(conn_fd, F_SETFD, (fcntl(conn_fd, F_GETFD)|O_NONBLOCK));

void setnonblocking(int sock) {
    int opt;

    opt = fcntl(sock, F_GETFL);
    if (opt < 0) {
        printf("fcntl(F_GETFL) fail.");
    }
    opt |= O_NONBLOCK;
    if (fcntl(sock, F_SETFL, opt) < 0) {
        printf("fcntl(F_SETFL) fail.");
    }
}

为什么函数setnonblocking可以设置文件描述符非阻塞。但是另一个不能。当epoll获得新连接时我使用它。

1 个答案:

答案 0 :(得分:1)

O_NONBLOCK是文件状态标志,而不是文件描述符标志。

也许,在您的fcntl(conn_fd, F_SETFD, (fcntl(conn_fd, F_GETFD)|O_NONBLOCK));中,您需要将F_GETFD更改为F_GETFL并将F_SETFD更改为F_SETFL,因为您需要修改文件状态标记,而不是文件描述符标记。