Сокеты: работа с примером из книги APUE - PullRequest
1 голос
/ 16 января 2012

Рассмотрим следующий пример из книги APUE:

#include <errno.h>
#include <sys/socket.h>
int initserver(int type, const struct sockaddr *addr, 
                    socklen_t alen, int qlen)
{
    int fd;
    int err = 0;
    if ((fd = socket(addr->sa_family, type, 0)) < 0)
        return -1;
    if (bind(fd, addr, alen) < 0) {
        err = errno;
        goto errout;
    }
    if (type == SOCK_STREAM || type == SOCK_SEQPACKET) {
        if (listen(fd, qlen) < 0) {
            err = errno;
            goto errout;
        }
    }
    return(fd);
errout:
    close(fd);
    errno = err;
    return -1;
}

Вопрос в том, почему errno сохраняется, а затем восстанавливается? Потому что это может быть установлено в close(fd)? Почему тогда это можно игнорировать?

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Да, это (вероятно) из-за вызова close. Возврат из close и его возможная ошибка игнорируется, потому что вызывающий initserver, скорее всего, захочет получить ошибку из функции socket или listen, если один из них завершится неудачей, а не из функции close, которая может установите errno на что-то совершенно неуместное.

0 голосов
/ 16 января 2012

ошибочно удерживать последнюю ошибку.

close (fd) может вызвать ошибку и перезаписать значение errno, он восстановит его позже, потому что вызывающая функция может выполнить perror, которая выводит значение errno, поэтому будет напечатана соответствующая ошибка

0 голосов
/ 16 января 2012

В: Вопрос в том, почему errno сохраняется, а затем восстанавливается? Потому что это можно установить в закрытом (fd)?

A: Да - точно.

Я почитаю Стивенс ... но, честно говоря, я бы этого не сделал. Если я хочу сохранить исходное значение errno, я бы сохранил его, а затем прочитал из моей собственной переменной.

ИМХО ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...