【问题标题】:Bad file descriptor错误的文件描述符
【发布时间】:2011-09-08 21:12:21
【问题描述】:

我正在学习文件描述符,并编写了以下代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int fdrd, fdwr, fdwt;
char c;

main (int argc, char *argv[]) {

    if((fdwt = open("output", O_CREAT, 0777)) == -1) {
        perror("Error opening the file:");
        exit(1);
    }

    char c = 'x';

    if(write(fdwt, &c, 1) == -1) {
        perror("Error writing the file:");
    }

    close(fdwt);
    exit(0);

}

,但我得到:Error writing the file:: Bad file descriptor

我不知道哪里出了问题,因为这是一个非常简单的例子。

【问题讨论】:

  • 从 open() 返回时 fdwt 的 val 是多少?它应该是一个小整数,比如小于5。实际上,由于这段代码中没有打开其他fd,它应该是3(即STDERR + 1)。
  • 顺便说一下,您的代码有几个问题。这些变量不需要是全局的(很少有),你应该在main 中声明它们。您还声明了两次c,第二次不需要char c 中的char。同时,函数中间的第二个c声明只在C99中有效,但是你声明main没有返回类型——在C99中无效,这就消除了“隐式int”规则存在于 C89 和 C 的早期版本中。大多数编译器应该为此发出警告,有些会抛出错误并拒绝编译。
  • 你应该接受答案!

标签: c file unix file-descriptor


【解决方案1】:

根据 open(2) 手册页:

参数标志必须包括以下访问模式之一:O_RDONLY、O_WRONLY 或 O_RDWR。

所以是的,按照其他人的建议,请将您的 open 更改为 open("output", O_CREAT|O_WRONLY, 0777));。如果您需要从文件中读取,请使用O_RDWR。您可能还需要O_TRUNC——详情请参见手册页。

【讨论】:

    【解决方案2】:

    试试这个:

    open("output", O_CREAT|O_WRONLY, 0777)
    

    【讨论】:

    • 哇!很快! :) 那行得通!现在我必须找出原因!非常感谢!
    • @Lucy - 它给了你一个文件描述符,所以打开并没有失败......但是描述符对于写入无效。
    • 您能否解释一下为什么需要 O_WRONLY,以及 0777 的来源?
    【解决方案3】:

    我认为仅O_CREAT 是不够的。尝试在打开命令中添加O_WRONLY 作为标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 2015-05-25
      • 2015-05-20
      • 1970-01-01
      相关资源
      最近更新 更多