如何使用fcntl取消已设置的标志?
例如,我可以使用以下方式将套接字设置为非阻塞模式:
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)
现在,我想取消 O_NONBLOCK 标志。 我尝试使用 fcntl(sockfd, F_SETFL, flags | ~O_NONBLOCK)。但是它给了我一个 EINVAL 错误。
int oldfl;
oldfl = fcntl(sockfd, F_GETFL);
if (oldfl == -1) {
/* handle error */
}
fcntl(sockfd, F_SETFL, oldfl & ~O_NONBLOCK);
flags = fcntl(fd, F_GETFD); if (flags == -1) /* 处理错误 */;
Chris,希望你不介意,但我恢复了你的原始代码。 - Daniel Trebbienval = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);
if ((flags = fcntl(fileno(sockfd), F_GETFL, 0)) < 0) {
perror("error on F_GETFL");
}
else {
flags &= ~O_NONBLOCK;
if (fcntl(fileno(sockfd), F_SETFL, flags) < 0) {
perror("error on F_SETFL");
}
else {
/* O_NONBLOCK set without errors. continue from here */
}
}
敬礼
尝试取消所有标志:
fcntl(sockfd, F_SETFL, 0);
同时,使用 ~O_NONBLOCK
进行 OR 操作没有任何作用,你需要进行 AND 操作,因为你想要取消设置 O_NONBLOCK 位。
flags & ~O_NONBLOCK
,即使用 &,而不是 |。 - C. K. Young