linux fcntl - 取消设置标志

发布于 2024-07-10 00:01:10 字数 238 浏览 13 评论 0原文

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

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

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

,我想取消设置 O_NONBLOCK 标志。

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

How do i unset a already set flag using fcntl?

For e.g. I can set the socket to nonblocking mode using

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

Now, i want to unset the O_NONBLOCK flag.

I tried fcntl(sockfd, F_SETFL, flags | ~O_NONBLOCK). It gave me error EINVAL

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甲如呢乙后呢 2024-07-17 00:01:10
int oldfl;
oldfl = fcntl(sockfd, F_GETFL);
if (oldfl == -1) {
    /* handle error */
}
fcntl(sockfd, F_SETFL, oldfl & ~O_NONBLOCK);

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

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

Untested, but hope this helps. :-)

兔姬 2024-07-17 00:01:10
val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);

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

val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);

If you do like this,The already set O_NONBLOCK will unset.
here,flags contains the which flags you want to unset.
After finishing the AND(&) operation,again you have to set the flag using the value in val.
I hope this will help you.

窝囊感情。 2024-07-17 00:01:10

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

问候

The following code will unset a flag, for example, the O_NONBLOCK flag:

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 */
        }
}

Regards

煮茶煮酒煮时光 2024-07-17 00:01:10

尝试取消设置所有标志:

fcntl(sockfd, F_SETFL, 0);

此外,将标志与 ~O_NONBLOCK 进行 OR 运算是没有用的,您需要对其进行 AND 操作,因为您想要的是取消设置 O_NONBLOCK 位。

Tried unsetting all flags:

fcntl(sockfd, F_SETFL, 0);

Also OR-ing the flags with ~O_NONBLOCK is of no use, you need to AND it, since what you want is to unset the O_NONBLOCK bit(s).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文