在我的代码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()
失败的原因?
在我的代码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()
失败的原因?
int errno=0;
问题是你 redeclared errno
,从而隐藏了全局符号(它甚至不需要是一个普通的变量)。效果是设置和打印的内容open
是不同的。相反,您应该包括标准errno.h
.
您不应该自己定义 errno 变量。errno 它是 errno.h 中定义的全局变量(它比变量更复杂)所以删除你int errno = 0;
并再次运行。不要忘记包含 errno.h
您正在声明一个局部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 );
请将此添加到您的模块中:#include <errno.h>
而不是int errno;