libtracefs(3)
=============

NAME
----
tracefs_trace_pipe_stream, tracefs_trace_pipe_print, tracefs_trace_pipe_stop -
redirect the stream of trace data to an output or stdout.

SYNOPSIS
--------
[verse]
--
*#include <tracefs.h>*

ssize_t *tracefs_trace_pipe_stream*(int _fd_, struct tracefs_instance pass:[*]_instance_, int _flags_);
ssize_t *tracefs_trace_pipe_print*(struct tracefs_instance pass:[*]_instance_, int _flags_);
void *tracefs_trace_pipe_stop*(struct tracefs_instance pass:[*]_instance_);


--

DESCRIPTION
-----------
If NULL is passed as _instance_, the top trace instance is used.

The reading of the trace_pipe file can be stopped by calling *tracefs_trace_pipe_stop()*
which could be placed in a signal handler in case the application wants to stop the
reading, for example, with the user pressing Ctrl-C.

The *tracefs_trace_pipe_stream()* function redirects the stream of trace data to an output
file. The "splice" system call is used to moves the data without copying between kernel
address space and user address space. The _fd_ is the file descriptor of the output file
and _flags_ is a bit mask of flags to be passed to the open system call of the trace_pipe
file (see ). If flags contain O_NONBLOCK, then that is also passed to the splice calls
that may read the file to the output stream file descriptor.

The *tracefs_trace_pipe_print()* function is similar to *tracefs_trace_pipe_stream()*, but
the stream of trace data is redirected to stdout.


RETURN VALUE
------------
The *tracefs_trace_pipe_stream()*, and *tracefs_trace_pipe_print()* functions return the
number of bytes transfered if the operation is successful, or -1 in case of an error.

EXAMPLE
-------
[source,c]
--
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>

#include <tracefs.h>

void stop(int sig)
{
	tracefs_trace_pipe_stop(NULL);
}

int main(int argc, char **argv)
{
	mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
	const char *filename;
	int fd;
	int ret;

	if (argc < 2) {
		fprintf(stderr, "usage: %s output_file\n", argv[0]);
		exit(-1);
	}
	filename = argv[1];
	fd = creat(filename, mode);
	if (fd < 0) {
		perror(filename);
		exit(-1);
	}
	signal(SIGINT, stop);
	ret = tracefs_trace_pipe_stream(fd, NULL, SPLICE_F_NONBLOCK);
	close(fd);

	return ret;
}
--
FILES
-----
[verse]
--
*tracefs.h*
	Header file to include in order to have access to the library APIs.
*-ltracefs*
	Linker switch to add when building a program that uses the library.
--

SEE ALSO
--------
*libtracefs*(3),
*libtraceevent*(3),
*trace-cmd*(1),
Documentation/trace/ftrace.rst from the Linux kernel tree

AUTHOR
------
[verse]
--
*Steven Rostedt* <rostedt@goodmis.org>
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>
--
REPORTING BUGS
--------------
Report bugs to  <linux-trace-devel@vger.kernel.org>

LICENSE
-------
libtracefs is Free Software licensed under the GNU LGPL 2.1

RESOURCES
---------
https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/

COPYING
-------
Copyright \(C) 2021 VMware, Inc. Free use of this software is granted under
the terms of the GNU Public License (GPL).
