如何使用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的主要内容,如果未能解决你的问题,请参考以下文章
c语言中fgets 、fputs、fread、fscanf、fseek的区别和作用
在C/C++程序中调用popen来执行cmd命令,且用fgets来读命令的打印,读到最后一个字节之后就陷入无尽等待
fgets 无法在 Ubuntu 20.04 上从管道读取两次
PHP中输出文件,怎么区别什么时候该用readfile() , fread(), file_get_contents(), fgets()