首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用fdopen

正确使用fdopen
EN

Stack Overflow用户
提问于 2020-05-17 19:34:53
回答 1查看 748关注 0票数 0

我的意思是将文件描述符与文件指针关联起来,并将其用于写入。我把程序io.cc放在下面:

代码语言:javascript
复制
int main() {
    ssize_t nbytes;
    const int fd = 3;
    char c[100] = "Testing\n";
    nbytes = write(fd, (void *) c, strlen(c));     // Line #1
    FILE * fp = fdopen(fd, "a");
    fprintf(fp, "Writing to file descriptor %d\n", fd);
    cout << "Testing alternate writing to stdout and to another fd" << endl;
    fprintf(fp, "Writing again to file descriptor %d\n", fd);
    close(fd);     // Line #2
    return 0;
}

我可以交替注释第1行和/或第2行,编译/运行

代码语言:javascript
复制
./io 3> io_redirect.txt

检查io_redirect.txt的内容。只要第1行没有注释,它就会在io_redirect.txt中生成预期的Testing\n行。如果注释了第2行,我将得到预期的行

代码语言:javascript
复制
Writing to file descriptor 3
Writing again to file descriptor 3

io_redirect.txt中。但是如果没有注释,这些行就不会出现在io_redirect.txt中。

  • 为什么会这样呢?
  • 使用fdopen的正确方法是什么?

注意到。这似乎是解决智能-从C/C++写入任意文件描述符 (部分)问题的正确方法--我说的是“部分”,因为我可以使用C风格的fprintf。我仍然想使用C++风格的stream<<.

编辑:我忘记了fclose(fp)。“关闭”了问题的一部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 09:42:28

为什么会这样呢?

打开的流(" stream“是打开的FILE*)是块缓冲的,因此在刷新文件之前不会将任何内容写入目标。退出应用程序关闭所有打开的流,其中冲淡溪流

因为在刷新流之前关闭了基础文件描述符,所以程序的行为是未定义的。我建议您阅读文件描述符与标准I/O流的交互 (尽管如此,它是用一种可怕的语言编写的),其中:

..。如果使用了两个或多个句柄,且其中任何一个是流,应用程序应确保它们的操作协调如下所述。如果不这样做,则结果是未定义的。 ..。 对于第一个句柄,适用下面的第一个适用条件。..。

  • ..。
  • 如果它是开放的可写入或附加(但也不开放供阅读)的流,则应用程序要么执行fflush(),要么关闭流。

“句柄”是文件描述符或流。“活动句柄”是您使用的最后一个句柄。

fp流是打开以附加到文件描述符3的活动句柄。因为fp是一个活动句柄,没有刷新,而且您用close(fd)将活动句柄切换到fd,所以程序的行为是未定义的。

我的猜测是,在fflush(fp)返回后,您的C标准库实现调用了main,因为fd关闭了,一些内部write(3, ...)调用返回错误,并且输出中没有写入任何内容。

使用fdopen的正确方法是什么?

您介绍的用法是使用fdopen的正确方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61857662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档