質問

どのように私はのfcntlを使用して、既に設定されたフラグの設定を解除しますか?

のために例えば私が使用してノンブロッキングモードにソケットを設定することができます。

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

さて、私はO_NONBLOCKフラグの設定を解除したい。

私は(|〜O_NONBLOCK数sockfd、F_SETFL、フラグ)のfcntlを試してみました。それは私に与えたエラーEINVAL

役に立ちましたか?

解決

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

テストされていないが、これは役立ちます願っています。 : - )

他のヒント

val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);
あなたはこのように行う場合は、

、既に設定されているO_NONBLOCKが設定解除されます。 ここでは、フラグを使用すると、設定を解除したいのフラグが含まれています。 AND(&)演算を終えた後、再び、あなたはヴァルの値を使用してフラグを設定する必要があります。 私は、これはあなたを助けることを願っています。

次のコードは、例えば、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 */
        }
}

よろしく

すべてのフラグを設定解除しようとしました。

fcntl(sockfd, F_SETFL, 0);
何をしたいので、

また、OR-INGの~O_NONBLOCKでフラグが役に立たない、あなたはO_NONBLOCKビット(複数可)を設定解除するために、される必要があり、ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top