2

在我的代码open()中失败,返回码为 -1,但不知何故errno没有设置。

int fd;
int errno=0;
fd = open("/dev/tty0", O_RDWR | O_SYNC);
printf("errno is %d and fd is %d",errno,fd);

输出是

errno is 0 and fd is -1

为什么没有设置errno?我如何确定open()失败的原因?

4

4 回答 4

14
int errno=0;

问题是你 redeclared errno,从而隐藏了全局符号(它甚至不需要是一个普通的变量)。效果是设置和打印的内容open是不同的。相反,您应该包括标准errno.h.

于 2012-07-09T14:05:44.730 回答
2

您不应该自己定义 errno 变量。errno 它是 errno.h 中定义的全局变量(它比变量更复杂)所以删除你int errno = 0;并再次运行。不要忘记包含 errno.h

于 2012-07-09T14:05:42.120 回答
2

您正在声明一个局部errno变量,有效地掩盖了全局errno. 您需要包含errno.h并声明 extern errno,例如:

#include <errno.h>
...

extern int    errno;

...
fd = open( "/dev/tty0", O_RDWR | O_SYNC );
if ( fd < 0 ) {
    fprintf( stderr, "errno is %d\n", errno );
    ... error handling goes here ...
}

您还可以使用strerror()将 errno 整数转换为人类可读的错误消息。您需要为此包括string.h

#include <errno.h>
#include <string.h>

fprintf( stderr, "Error is %s (errno=%d)\n", strerror( errno ), errno );
于 2012-07-09T14:07:28.903 回答
1

请将此添加到您的模块中:#include <errno.h> 而不是int errno;

于 2012-07-09T14:06:51.383 回答