trace-cmd がオフ ftrace の raw ファイルをゼロ コピーするために使用する splice syscall を試してみたかったのです。
以下は、splice が読み取りに失敗する ftrace raw ファイルの部分的なリストです。
/sys/kernel/debug/tracing/per_cpu/cpo0/trace_pipe_raw
/sys/kernel/debug/tracing/per_cpu/cpo0/snapshot_raw
/sys/kernel/debug/tracing/per_cpu/cpo1/trace_pipe_raw
/sys/kernel/debug/tracing/per_cpu/cpo1/snapshot_raw
そして、ここにいくつかの他のファイルがあります(スプライスは問題なく処理します):
/sys/kernel/debug/tracing/per_cpu/cpo0/trace_pipe
/sys/カーネル/デバッグ/トレース/per_cpu/cpo0/スナップショット
/sys/kernel/debug/tracing/per_cpu/cpo1/trace_pipe
/sys/カーネル/デバッグ/トレース/per_cpu/cpo1/スナップショット
機能するもの:
- read() システム コールを使用すると、生の ftrace ファイルから読み取ることができます。
- cat() システム コールを使用すると、生の ftrace ファイルが表示されます。
- ftrace の CLI フロントエンドである trace-cmd ツールを使用します。
これは私のコードです:
static void unit_test_x(void)
{
int buffer_pipe[2];
pipe(buffer_pipe);
std::string source_path = "/sys/kernel/debug/tracing/per_cpu/cpu1/trace_pipe_raw";
int trace_fd = open(source_path.c_str(), O_RDONLY);
std::string destination_path = "foo";
int dest_fd = open (destination_path.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, 0644);
int actually_read = splice(trace_fd,
NULL,
buffer_pipe[1],
NULL,
1000,
SPLICE_F_MORE | SPLICE_F_MOVE );
if (0 > actually_read )
{
printf("Oh dear, something went wrong %s\n", s trerror(errno));
throw std::runtime_error("writing from source to pipe failed");
}
actually_read = splice(buffer_pipe[0],
NULL,
dest_fd,
NULL,
actually_read,
SPLICE_F_MORE | SPLICE_F_MOVE);
}
ノート:
/sys/kernel/debug/tracing へのすべてのアクセスは sudo で行われます