9

fcntl を使用して既に設定されているフラグを設定解除するにはどうすればよいですか?

たとえば、次を使用してソケットを非ブロックモードに設定できます

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

今、私は O_NONBLOCK フラグを設定解除したいと思います。

fcntl(sockfd, F_SETFL, flags | ~O_NONBLOCK) を試してみました。エラーEINVALが発生しました

4

4 に答える 4

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

テストされていませんが、これが役立つことを願っています。:-)

于 2008-12-23T08:55:46.463 に答える
3
val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);

このようにすると、すでに設定されている O_NONBLOCK が設定解除されます。ここで、フラグには、設定を解除するフラグが含まれています。AND(&) 演算が終了したら、val の値を使用してフラグを設定する必要があります。これがお役に立てば幸いです。

于 2011-10-07T06:30:35.303 に答える
1

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

よろしく

于 2012-03-22T10:32:35.187 に答える
0

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

fcntl(sockfd, F_SETFL, 0);

また、フラグの OR は役に立ち~O_NONBLOCKません。必要なのは O_NONBLOCK ビットの設定を解除することなので、AND にする必要があります。

于 2008-12-23T09:07:37.623 に答える