popen 是将整个输出加载到内存中还是保存在 tmp 文件中(在磁盘中)?

Does popen load whole output into memory or save in a tmp file(in disk)?

我想用这段代码读取一个非常非常大的压缩文件的一部分(解压后为 119.2 GiB)。

FILE* trace_file;
char gunzip_command[1000];
sprintf(gunzip_command, "gunzip -c %s", argv[i]); // argv[i]: file path
trace_file = popen(gunzip_command, "r");
fread(&current_cloudsuite_instr, instr_size, 1, trace_file)

c 中的 popen 是否将命令的整个输出加载到内存中?如果没有,popen 是否将命令的整个输出保存在 tmp 文件中(在磁盘中)?如您所见,解压缩的输出会太大。内存和磁盘都无法容纳它。 我只知道popen创建了一个管道

$ xz -l 649.fotonik3d_s-1B.champsimtrace.xz  
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1     24.1 MiB    119.2 GiB  0.000  CRC64   649.fotonik3d_s-1B.champsimtrace.xz

I only know that popen creates a pipe.

我知道有两种管道实现方式:

在MS-DOS,整个输出被写入磁盘;然后通过读取文件完成读取。

可能仍然有 (less-known) 个现代操作系统以这种方式工作。

但是,在大多数情况下,都会为管道预留一定的内存。

xz 命令可以写入数据,直到该内存量已满。如果内存已满,xz 将停止,直到内存可用(因为调用 popen() 的程序读取数据)。

如果调用 popen() 的程序从管道读取数据,数据将从内存中删除,以便 xz 可以写入更多数据。

当调用popen()的程序关闭文件句柄时,写入管道不再起作用;一条错误消息报告给 xz ...