Вопрос

Как мне сбросить уже установленный флаг с помощью 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 будет сброшен.здесь flags содержит, какие флаги вы хотите отменить.После завершения операции 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);

Также или флаги с ~O_NONBLOCK бесполезно, вам нужно И это, поскольку то, что вы хотите, это сбросить бит (ы) O_NONBLOCK.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top