我正在运行两个程序,其中一个程序的标准输出通过管道传输到另一个程序的标准输入。我通过以下方式使用命名管道执行此操作(为了演示而简化):
$ mkfifo feedback
$ ./program1 < feedback | ./program2 > feedback
我注意到程序 1 中存在一些性能问题,因此我尝试在
perf-record
下运行它,如下所示:
$ perf record -g ./program1 < feedback | ./program2 > feedback
但是 2 号程序因输入无效而失败。这是一个十六进制转储:
$ perf record -g ./program1 < feedback | tee p1_to_p2 | ./program2 > feedback
$ hexdump -C p1_to_p2
00000000 50 45 52 46 49 4c 45 32 10 00 00 00 00 00 00 00 |PERFILE2........|
00000010
通过谷歌快速搜索,我发现
PERFILE2
是perf数据文件的神奇数字,所以看起来当在管道中使用时perf通过stdout
发送其数据。
我想避免这种行为,只是让 perf 像平常一样输出一个文件,但在 perf 手册中没有找到任何相关内容。
如何强制 perf 输出到文件?
使用
perf-record
的 -o
或 --output
标志。来自man perf-record
:
-o, --output=
Output file name.
然后我们就可以写了
$ perf record -o perf.data -g ./program1 < feedback | ./program2 > feedback
并且
perf
会将其输出数据写入指定的文件,即使它正在管道中使用。