如何使用fgets / fread读取PIPE

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用fgets / fread读取PIPE相关的知识,希望对你有一定的参考价值。

我有两个进程A,B和一个管道(my_pipe [2]),我需要进程A来读取进程B的输出。在进程B中,我有dup2(my_pipe[1], stdout);在A中,我需要继续读取B的输出并逐行处理。

我想在A中使用fread/fgets而不是read,但my_pipe[0]是文件描述符而不是* FILE。如何将fread / fgets用于管道?

答案

Use fdopen()(使用POSIX参考,因为您已经在使用POSIX文件描述符):

name

fdopen - associate a stream with a file descriptor

概要

[CX] [Option Start] #include <stdio.h>

FILE *fdopen(int fildes, const char *mode); [Option End]

描述

The fdopen() function shall associate a stream with a file descriptor.

The mode argument is a character string having one of the following values:

r or rb
    Open a file for reading.
w or wb
    Open a file for writing.
a or ab
    Open a file for writing at end-of-file.
r+ or rb+ or r+b
    Open a file for update (reading and writing).
w+ or wb+ or w+b
    Open a file for update (reading and writing).
a+ or ab+ or a+b
    Open a file for update (reading and writing) at end-of-file.

这些标志的含义与fopen()中的指定完全相同,只是以w开头的模式不会导致文件被截断。

例如:

FILE *fptr = fdopen( fd, "rb" );

然后你可以在fread()上使用fgets()fptr(以及其他)。

以上是关于如何使用fgets / fread读取PIPE的主要内容,如果未能解决你的问题,请参考以下文章

php中readline与fread / fgets的区别

C 编程中的 fread 函数

c语言中fgets 、fputs、fread、fscanf、fseek的区别和作用

在C/C++程序中调用popen来执行cmd命令,且用fgets来读命令的打印,读到最后一个字节之后就陷入无尽等待

fgets 无法在 Ubuntu 20.04 上从管道读取两次

PHP中输出文件,怎么区别什么时候该用readfile() , fread(), file_get_contents(), fgets()