考虑以下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)
中设置吗?为什么它可以忽略呢?
答案 0 :(得分:2)
是的,它(可能)是因为close
电话。 close
的返回及其可能的错误被忽略,因为initserver
的调用者很可能希望socket
或listen
函数出现错误,如果其中一个失败,则不会从close
函数可以将errno
设置为完全不相关的函数。
答案 1 :(得分:0)
问:问题是为什么errno被保存然后恢复?因为它 可以设置为关闭(fd)?
答:是的 - 完全正确。
我尊敬史蒂文斯......但坦率地说,我不会这样做。如果我想保留原始的errno,我会将其保存到 - 然后从 - 我自己的变量中读取它。
... IMHO
答案 2 :(得分:0)
错误保持最后一次错误。
close(fd)会导致错误并覆盖errno的值,他稍后会恢复它,因为调用函数可能会执行perror打印errno的值,因此会打印相关的错误