我有两种方法可以设置文件描述符非阻塞。
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获得新连接时我使用它。
答案 0 :(得分:1)
O_NONBLOCK
是文件状态标志,而不是文件描述符标志。
也许,在您的fcntl(conn_fd, F_SETFD, (fcntl(conn_fd, F_GETFD)|O_NONBLOCK));
中,您需要将F_GETFD
更改为F_GETFL
并将F_SETFD
更改为F_SETFL
,因为您需要修改文件状态标记,而不是文件描述符标记。