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