9

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

例如,我可以使用将套接字设置为非阻塞模式

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

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

我试过 fcntl(sockfd, F_SETFL, flags | ~O_NONBLOCK)。它给了我错误 EINVAL

4

4 回答 4

8
int oldfl;
oldfl = fcntl(sockfd, F_GETFL);
if (oldfl == -1) {
    /* handle error */
}
fcntl(sockfd, F_SETFL, oldfl & ~O_NONBLOCK);

未经测试,但希望这会有所帮助。:-)

于 2008-12-23T08:55:46.463 回答
3
val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);

如果你这样做,已经设置的 O_NONBLOCK 将被取消设置。在这里,flags 包含您要取消设置的标志。完成 AND(&) 操作后,您必须再次使用 val 中的值设置标志。我希望这能帮到您。

于 2011-10-07T06:30:35.303 回答
1

以下代码将取消设置标志,例如 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 */
        }
}

问候

于 2012-03-22T10:32:35.187 回答
0

尝试取消设置所有标志:

fcntl(sockfd, F_SETFL, 0);

此外,对标志进行或运算~O_NONBLOCK也没用,您需要对它进行与运算,因为您想要的是取消设置 O_NONBLOCK 位。

于 2008-12-23T09:07:37.623 回答