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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top