X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-consumerd%2Flttng-consumerd.c;h=e5d7ba1c60051aebdd6c1f435b6c692294065e6f;hb=f02e1e8a5820da2eda835add020f92ca8d32c973;hp=32571bddf36cfc94483eaf0f180694ac21a99fae;hpb=d14d33bf091e72b23b1f90ea18a0a01bed098b76;p=lttng-tools.git diff --git a/src/bin/lttng-consumerd/lttng-consumerd.c b/src/bin/lttng-consumerd/lttng-consumerd.c index 32571bddf..e5d7ba1c6 100644 --- a/src/bin/lttng-consumerd/lttng-consumerd.c +++ b/src/bin/lttng-consumerd/lttng-consumerd.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -38,13 +39,12 @@ #include #include #include +#include #include #include -#include -#include +#include #include -#include #include "lttng-consumerd.h" @@ -227,6 +227,25 @@ static void parse_args(int argc, char **argv) } } +/* + * Set open files limit to unlimited. This daemon can open a large number of + * file descriptors in order to consumer multiple kernel traces. + */ +static void set_ulimit(void) +{ + int ret; + struct rlimit lim; + + /* The kernel does not allowed an infinite limit for open files */ + lim.rlim_cur = 65535; + lim.rlim_max = 65535; + + ret = setrlimit(RLIMIT_NOFILE, &lim); + if (ret < 0) { + PERROR("failed to set open files limit"); + } +} + /* * main */ @@ -242,11 +261,26 @@ int main(int argc, char **argv) /* Daemonize */ if (opt_daemon) { + int i; + + /* + * fork + * child: setsid, close FD 0, 1, 2, chdir / + * parent: exit (if fork is successful) + */ ret = daemon(0, 0); if (ret < 0) { - perror("daemon"); + PERROR("daemon"); goto error; } + /* + * We are in the child. Make sure all other file + * descriptors are closed, in case we are called with + * more opened file descriptors than the standard ones. + */ + for (i = 3; i < sysconf(_SC_OPEN_MAX); i++) { + (void) close(i); + } } if (strlen(command_sock_path) == 0) { @@ -272,6 +306,11 @@ int main(int argc, char **argv) /* Init */ lttng_consumer_init(); + if (!getuid()) { + /* Set limit for open files */ + set_ulimit(); + } + /* create the consumer instance with and assign the callbacks */ ctx = lttng_consumer_create(opt_type, lttng_consumer_read_subbuffer, NULL, lttng_consumer_on_recv_stream, NULL);