linux fcntl-取消设置标志

linux fcntl-取消设置标志,linux,fcntl,Linux,Fcntl,如何使用fcntl取消设置已设置的标志 例如,我可以使用 fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) 现在,我想取消设置O_非块标志 我尝试了fcntl(sockfd、F|u SETFL、flags | ~O_NONBLOCK)。它给了我一个错误 int oldfl; oldfl = fcntl(sockfd, F_GETFL); if (oldfl == -1) { /* handle error */ } fcntl(sockfd, F_S

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

例如,我可以使用

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)
现在,我想取消设置O_非块标志

我尝试了fcntl(sockfd、F|u SETFL、flags | ~O_NONBLOCK)。它给了我一个错误

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

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

尝试取消设置所有标志:

fcntl(sockfd, F_SETFL, 0);
此外,使用
~O_NONBLOCK
对标志进行加密也没有用,您需要对其进行加密,因为您需要的是取消设置O_NONBLOCK位

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

以下代码将取消设置标志,例如,O_非块标志:

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 */
        }
}
if((flags=fcntl(fileno(sockfd),F_GETFL,0))<0){
perror(“F_GETFL上的错误”);
}
否则{
标志&=~O_非块;
如果(fcntl(文件号(sockfd)、F_设置、标志)<0){
perror(“F_SETFL上的错误”);
}
否则{
/*O_非块集没有错误。从此处继续*/
}
}

关于

尝试使用标志和~O_非块。i、 是的,你是对的。复制、粘贴问题::-。编码时需要思考。当然。请阅读我对你问题的评论。也就是说,除非您的编辑中有输入错误,否则您必须使用&来清除标志,而不是|。Daniel感谢您指出这一点。有时,我认为大量无用的错误检查会阻碍新程序员在实际需要的地方进行重要的错误检查。@DanielTrebbien:错。只有非错误值不是负值
fcntl(fd,F_GETFL)
可能会失败,即它可以返回
-1
,例如。@J.F.Sebastian:Oops,我的错误。你说得对。事实上,表示“否则,-1应返回,并设置errno以指示错误。”并给出了一个示例:
flags=fcntl(fd,F_GETFD);如果(标志==-1)/*处理错误*克里斯,我希望你不介意,但我恢复了你原来的代码。如果你只想取消非阻塞标志,取消所有标志的设置有点过头了。:-)
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 */
        }
}