套接字:处理APUE书中的示例

时间:2012-01-16 17:07:04

标签: c sockets

考虑以下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 个答案:

答案 0 :(得分:2)

是的,它(可能)是因为close电话。 close的返回及其可能的错误被忽略,因为initserver的调用者很可能希望socketlisten函数出现错误,如果其中一个失败,则不会从close函数可以将errno设置为完全不相关的函数。

答案 1 :(得分:0)

  

问:问题是为什么errno被保存然后恢复?因为它   可以设置为关闭(fd)?

答:是的 - 完全正确。

尊敬史蒂文斯......但坦率地说,我不会这样做。如果我想保留原始的errno,我会将其保存到 - 然后从 - 我自己的变量中读取它。

... IMHO

答案 2 :(得分:0)

错误保持最后一次错误。

close(fd)会导致错误并覆盖errno的值,他稍后会恢复它,因为调用函数可能会执行perror打印errno的值,因此会打印相关的错误