为什么open()失败并且没有设置errno?

时间:2012-07-09 14:01:47

标签: c linux file-io linux-kernel errno

在我的代码中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 个答案:

答案 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 );