splice (2) возвращает «Неверный аргумент» при чтении из файлов ftrace raw - PullRequest
0 голосов
/ 09 марта 2020

Я хотел попробовать системный вызов сплайсинга, который trace-cmd использует для обнуления необработанных файлов без ftrace.

Вот неполный список, который не может прочитать сплайс необработанных файлов ftrace:

/ 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 / kernel / debug / tracing / per_cpu / cpo0 / snapshot

/ sys / kernel / debug / tracing / per_cpu / cpo1 / trace_pipe

/ sys / kernel / debug / tracing / per_cpu / cpo1 / snapshot

Что работает:

  • при использовании системного вызова read () прекрасно работает для чтения из необработанных файлов ftrace.
  • при использовании системного вызова cat () отображаются необработанные файлы ftrace.
  • используя т инструмент race-cmd, который является интерфейсом CLI для ftrace.

Это мой код:

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);

}

note:

Все доступ к / sys / kernel / debug / tracing выполняется с помощью sudo

1 Ответ

0 голосов
/ 09 марта 2020

После долгих проблем я решил проблему. splice не будет читать меньше, чем размер страницы (4096 байт) из «сырого» файла, который представляет собой поток двоичных данных. Если размер страницы будет меньше, это приведет к ошибке «Неверный аргумент».

...