首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux fcntl -取消设置标志

linux fcntl -取消设置标志
EN

Stack Overflow用户
提问于 2008-12-23 08:50:44
回答 4查看 11.4K关注 0票数 9

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

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

代码语言:javascript
复制
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-23 08:55:46

代码语言:javascript
复制
int oldfl;
oldfl = fcntl(sockfd, F_GETFL);
if (oldfl == -1) {
    /* handle error */
}
fcntl(sockfd, F_SETFL, oldfl & ~O_NONBLOCK);

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

票数 8
EN

Stack Overflow用户

发布于 2011-10-07 14:30:35

代码语言:javascript
复制
val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);

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

票数 3
EN

Stack Overflow用户

发布于 2012-03-22 18:32:35

以下代码将取消设置标志,例如O_NONBLOCK标志:

代码语言:javascript
复制
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 */
        }
}

问候

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/388434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档