【问题标题】:Bad file descriptor error when trying to associate fmemopen file descriptor with stdin尝试将 fmemopen 文件描述符与标准输入关联时出现错误的文件描述符错误
【发布时间】:2019-02-26 10:12:53
【问题描述】:

我正在尝试插入最初从stdin 读取的fscanf 函数,例如fscanf(stdin,"%ms", &secret)。在我的插入函数中,我试图让它从我用字符串创建的输入文件中读取。以下是我正在做的事情:

int fscanf(FILE *stream, const char *format, ...){

   FILE * in ;
   char * buffer = "secretString";
   size_t length = strlen(buffer);

  in = fmemopen(buffer, length, "r");
  if (in== NULL){
  handle_error("fmemopen");}
  // This is the part where I'm trying to feed my file as stdin
  // since original fscanf expects stdin which I'm trying to hack
  int dptr = fileno(in);
  dup2(dptr, 0);
  va_list args;
  va_start(args, format);

  int p = vfscanf(in, format, args);
    va_end(ap);
    fclose(in);
    return p;
}

但是,我收到 Bad file descriptor 错误。如果有人能告诉我我做错了什么,我将不胜感激。

【问题讨论】:

  • fileno(in) 产生什么价值?这实际上是一个打开的文件描述符吗?目前尚不清楚您从哪里获得 EBADF。在您测试fmemopen() 是否成功后,您不会显示错误检测代码。不要忘记关闭您打开的内容。我的怀疑是你试图尝试一些不受支持的东西。基于字符串的文件流应该有一个与之关联的有效打开文件描述符,也没有明显的理由可以将该文件描述符复制到dup2()。我从来没有想过尝试;我认为实现是不同的。
  • @JonathanLeffler:很明显:fileno(in) 返回 -1,因为内存缓冲区 FILE 没有关联的文件描述符。
  • @R.. - 它没有显示在检测到 EBADF 的问题中。代码中没有提到errno。

标签: c input io shared-libraries file-descriptor


【解决方案1】:

我不清楚你从哪里得到的想法,你应该尝试像这样替换标准输入的文件描述符。它不能那样工作,因为fmemopen 的全部意义在于它背后没有底层文件(因此没有文件描述符);它只是对 stdio API 的内存缓冲区的改编。

幸运的是,我认为您没有理由需要或想要重新映射文​​件描述符来执行您想要的操作。如果您拦截fscanf 并使用不同的FILE* 参数重新调用vfscanf,则stdin 不会被使用,因此对其进行任何更改都将无效。

【讨论】:

    【解决方案2】:

    fmemopen(3) 写道:

    注意事项

    没有与返回的文件流关联的文件描述符 通过这个函数(即,如果调用 fileno(3) 将返回错误 返回的流)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多