【问题标题】:Does fprintf() work for writing in a pipe, or I must always use write()?fprintf() 是否适用于在管道中写入,或者我必须始终使用 write()?
【发布时间】:2021-01-29 11:44:35
【问题描述】:

请记住,当使用fprintf() 时,我知道我需要传递文件描述符才能写入管道。我只是有疑问,现在想知道;我真的没有任何示例代码。

另外,我想知道fputc()、fputs()等函数是否也可以工作。

【问题讨论】:

  • 请记住,由于 pipe() 为您提供了文件描述符,因此您需要使用 fdopen()。但可以肯定的是:fprintf()、fputc()、fputs() 和朋友应该可以正常工作 - 没问题 :)
  • 谢谢@paulsm4,我不知道它们是不同的东西,现在我知道了!

标签: c unix process pipe posix


【解决方案1】:

使用 fprintf() 需要文件流 (FILE *)。创建管道时,您会获得两个文件描述符。文件描述符与流不同。

您可以使用 POSIX fdopen() 函数从文件描述符创建文件流;然后,您可以在该文件流上使用fprintf() — 或任何其他采用显式文件流参数并写入流的标准 I/O 函数。你不能使用fseek();你会得到一个错误(ESPIPE — 非法搜索)。

如果您的系统支持,您可以(理论上)使用 POSIX dprintf() 函数直接写入文件描述符。

【讨论】:

  • 谢谢!我可以使用 dprintf() 的事实真的很高兴知道!
【解决方案2】:

您可以使用fdopen() 将文件描述符转换为FILE *,然后使用所有stdio 函数。

int pipefd[2];
pipe(pipefd);

FILE *pipeout = fdopen(pipefd[1], "w");
fprintf(pipeout, "Message written to the pipe\n");

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2023-01-08
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多