我如何使用的fcntl取消设置已经设置的标志?

有关例如我可以使用套接字设为非阻塞模式

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

现在,我想取消设置O_NONBLOCK标志。

我尝试的fcntl(的sockfd,F_SETFL,旗帜|〜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);

另外的OR-ing标志与~O_NONBLOCK是没有用的,你需要与它,因为你想要的是取消设置O_NONBLOCK位(S)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top