如何使用 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);
未经测试,但希望这会有所帮助。:-)
val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);
如果你这样做,已经设置的 O_NONBLOCK 将被取消设置。在这里,flags 包含您要取消设置的标志。完成 AND(&) 操作后,您必须再次使用 val 中的值设置标志。我希望这能帮到您。
以下代码将取消设置标志,例如 O_NONBLOCK 标志:
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
也没用,您需要对它进行与运算,因为您想要的是取消设置 O_NONBLOCK 位。