【问题标题】:how to set file descriptor non-blocking?如何设置文件描述符非阻塞?
【发布时间】:2014-12-03 07:52:49
【问题描述】:

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

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获取新连接时使用这个。

【问题讨论】:

    标签: c linux nonblocking epoll


    【解决方案1】:

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

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

    【讨论】:

    • 我将 F_SETFD 更改为 F_SETFL,它可以工作,我需要现有 flags.thx 的状态!
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多