linux fcntl - Entschärfen Flagge
Frage
Wie unset ich einen bereits gesetzten Flag Fcntl mit?
Für z.B. Ich kann den Socket nicht blockierenden Modus eingestellt mit
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)
Nun, ich möchte die O_NONBLOCK Flag nicht gesetzt.
Ich habe versucht, fcntl (sockfd, F_SETFL, Fahnen | ~ O_NONBLOCK). Es gab mir Fehler EINVAL
Lösung
int oldfl;
oldfl = fcntl(sockfd, F_GETFL);
if (oldfl == -1) {
/* handle error */
}
fcntl(sockfd, F_SETFL, oldfl & ~O_NONBLOCK);
Nicht getestet, aber hoffe, das hilft. : -)
Andere Tipps
val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);
Wenn Sie dies tun, die bereits gesetzt O_NONBLOCK wird nicht gesetzt. hier, Fahnen enthält die, welche Flags Sie nicht gesetzt werden soll. den UND (&) Betriebes Nach dem Abschluss wieder haben Sie die Flagge, um den Wert in val verwenden. Ich hoffe, dies wird Ihnen helfen.
Der folgende Code wird ein Flag unset, zum Beispiel die O_NONBLOCK Flagge:
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 */
}
}
Viele Grüße
Versuche unsetting alle Flaggen:
fcntl(sockfd, F_SETFL, 0);
Auch OR-ing die Fahnen mit ~O_NONBLOCK
zwecklos ist, müssen Sie UND es, da das, was Sie wollen, ist das O_NONBLOCK Bit unscharf zu schalten (s).