【问题标题】:Why does open() fail and errno is not set?为什么 open() 失败并且没有设置 errno?
【发布时间】:2012-07-09 14:01:46
【问题描述】:

在我的代码中,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() 失败的原因?

【问题讨论】:

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


    【解决方案1】:
    int errno=0;
    

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

    【讨论】:

    • 另外,不要做errno = 0open 无论如何都会正确设置它。
    • @Mr.32 那个打开的调用似乎直接打开了一个tty 设备,通常与控制台相关联。我怀疑错误信息是 EPERM。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您声明了一个本地 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 );
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-27
          • 2018-06-26
          • 2018-02-02
          • 2016-05-06
          相关资源
          最近更新 更多