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
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).