我如何使用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将被取消设置。 在这里,标志包含你想要取消设置的标志。 完成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位。