Tag: errno

你为什么不能检查errno是否等于ERANGE?

我一直在尝试使用strtol将char数组正确转换为long,检查是否存在溢出或下溢,然后对long执行int转换。 一路上,我注意到很多代码看起来像这样 if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE) { // Handle the error } 为什么你不能只说 if(errno == ERANGE) { // Handle the error } 根据我的理解,如果发生下溢或溢出,则在两种情况下都将errno设置为ERANGE。 前者真的有必要吗? 可以单独检查ERANGE是否有问题? 这就是我的代码现在的样子 char *endPtr; errno = 0; long result = strtol(str, &endPtr, 10); if(errno == ERANGE) { // Handle Error } else if(result […]

错误:使用未声明的标识符’errno_t’

这是我死的简单虚拟代码: #include int main(void) { errno_t e; return 0; } 这令人惊讶地引发了这个错误: main.c:5:5: error: use of undeclared identifier ‘errno_t’ errno_t x; ^ 我开始遵循这些跟踪 :当编译器看到包含时,它将首先查看/usr/include当然我找到了errno.h文件。 实际上它除了许可证注释外还有一行,它是: #include 现在,在errno.h /usr/include/sys中,我找到了以下行: #include #if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 #include #endif 在/usr/include/_types中的/usr/include/_types _errno_t.h我发现了这个: typedef int errno_t; 所以看起来,它就在那里,它是整数类型的别名,也是errno.h一部分 – 正如它应该的那样。 那为什么不包括在内呢? 为什么编译器会引发未声明的标识符错误? 提前致谢! 相关信息: Compiler: Apple LLVM version 5.1 (clang-503.0.40) (based […]

如何检查errno的值?

我正在使用系统调用,如果失败,我需要为不同的errnos做不同的事情。 我需要编写看起来像这样的代码: int res; res = systemCall(); if (res == -1) { if (errno == ENOMSG) { doSomething(); } else { doSomethingElse(); } } perror没有帮助,因为它只打印值。 至于strerro – 如果它是我需要的,我不是如何使用它,因为在这里它说实际的字符串与错误不同。 从手册页引用:“(例如,如果errnum是EINVAL,则返回的描述将是”无效参数“)”。 我正在使用Linux。 系统调用:msgsend和msgrcv( https://linux.die.net/man/2/msgrcv )。 我不确定你问的C库是什么。 我看到我没有很好地解释自己。 语句if(errno == ENOMSG)是否有效? 有这样一个变量errno? 基本上我的问题是:为了测试errno, if语句应该怎么做?

无法分配请求的地址 – 可能的原因?

我有一个由主服务器和分布式从服务器组成的程序。 从属服务器向服务器发送状态更新,如果服务器在固定时间内没有从特定从属设备收到消息,则它将从属设备标记为关闭。 这种情况一直在发生。 通过检查日志,我发现从服务器只能向服务器发送一个状态更新,然后永远不能发送另一个更新,总是无法调用connect()“无法分配请求的地址(99)。 奇怪的是,从服务器能够向服务器发送多个其他更新,并且所有连接都发生在同一端口上。 似乎这种失败的最常见原因是连接处于打开状态,但我无法找到任何未解决的问题。 还有其他可能的解释吗? 为了澄清,这是我如何连接: struct sockaddr *sa; // parameter size_t sa_size; //parameter int i = 1; int stream; stream = socket(AF_INET,SOCK_STREAM,0); setsockopt(stream,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i)); bindresvport(stream,NULL); connect(stream,sa,sa_size); 此代码用于获取与另一个服务器的连接,并且这4个调用中的任何一个失败都会导致该函数失败。