linux fcntl – 取消设置标志

我如何使用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位。