linux fcntl - сбросить флаг - PullRequest
       11

linux fcntl - сбросить флаг

6 голосов
/ 23 декабря 2008

Как мне снять уже установленный флаг, используя fcntl?

Например, Я могу установить сокет в неблокирующем режиме, используя

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

Теперь я хочу снять флаг O_NONBLOCK.

Я пробовал fcntl (sockfd, F_SETFL, флаги | ~ O_NONBLOCK). Это дало мне ошибку EINVAL

Ответы [ 4 ]

4 голосов
/ 23 декабря 2008
int oldfl;
oldfl = fcntl(sockfd, F_GETFL);
if (oldfl == -1) {
    /* handle error */
}
fcntl(sockfd, F_SETFL, oldfl & ~O_NONBLOCK);

Не проверено, но надеюсь, что это поможет. : -)

3 голосов
/ 07 октября 2011
val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);

Если вам это нравится, уже установленный O_NONBLOCK будет сброшен. Здесь flags содержит флаги, которые вы хотите сбросить. После завершения операции AND (&) снова необходимо установить флаг, используя значение в val. Я надеюсь, что это поможет вам.

1 голос
/ 22 марта 2012

Следующий код сбросит флаг, например флаг 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 */
        }
}

Привет

0 голосов
/ 23 декабря 2008

Пробовал сбросить все флаги:

fcntl(sockfd, F_SETFL, 0);

Также ИЛИ - флаги с ~O_NONBLOCK бесполезны, вам нужно использовать AND, поскольку вам нужно сбросить биты O_NONBLOCK.

...