Question

Comment puis-je UNSET un drapeau déjà défini à l'aide fcntl?

Par exemple, Je peux mettre la douille en mode non bloquant à l'aide

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

Maintenant, je veux désinitialiser le drapeau O_NONBLOCK.

J'ai essayé fcntl (sockfd, F_SETFL, drapeaux | ~ O_NONBLOCK). Cela m'a donné l'erreur EINVAL

Était-ce utile?

La solution

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

Non testé, mais espérons que cette aide. : -)

Autres conseils

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

Si vous le faites comme ça, le O_NONBLOCK déjà défini sera hors service. ici, drapeaux contient les drapeaux qui vous voulez unset. Après avoir terminé l'AND (&) opération, encore une fois, vous devez définir le drapeau en utilisant la valeur en val. J'espère que cela vous aidera.

Le code suivant désinitialiser un drapeau, par exemple, le drapeau 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 */
        }
}

Cordialement

J'ai essayé tous les drapeaux MHS:

fcntl(sockfd, F_SETFL, 0);

En outre un OU les drapeaux avec ~O_NONBLOCK est d'aucune utilité, vous avez besoin et, puisque ce que vous voulez est de désinitialiser le bit O_NONBLOCK (s).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top