fcntl を使用して既に設定されているフラグを設定解除するにはどうすればよいですか?
たとえば、次を使用してソケットを非ブロックモードに設定できます
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)
今、私は O_NONBLOCK フラグを設定解除したいと思います。
fcntl(sockfd, F_SETFL, flags | ~O_NONBLOCK) を試してみました。エラー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(&) 演算が終了したら、val の値を使用してフラグを設定する必要があります。これがお役に立てば幸いです。
次のコードは、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 は役に立ち~O_NONBLOCK
ません。必要なのは O_NONBLOCK ビットの設定を解除することなので、AND にする必要があります。