From ee913da0363be4ee94451a9894f2f54a5e69d5e5 Mon Sep 17 00:00:00 2001 From: mar77i Date: Mon, 23 Mar 2026 22:09:59 +0100 Subject: [PATCH] apply timer after parsing args. add help message --- parse_args.c | 30 +++++++++++++++++++++++++++++- perftrace.c | 6 +++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/parse_args.c b/parse_args.c index 25494b9..41c3e6a 100644 --- a/parse_args.c +++ b/parse_args.c @@ -91,6 +91,25 @@ static inline int parse_arg_delay( return argc; } +static inline void print_help_and_exit(const char *argv0) { + printf( + ( + "Usage: %s [-h|--help] [--delay DELAY] [--humanize] --pid PID ...\n" + "\n" + "Options:\n" + "-h, --help display this help\n" + "--delay A timeval (ms) in which to measure\n" + "--humanize Print memory human-readable rather than bytes\n" + "--pid PID Process ids to track. Specify multiple times\n" + " PID+ track all the direct child processes\n" + " PID* track all child processes recursively\n" + "\n" + ), + argv0 + ); + exit(0); +} + int parse_args( int argc, char **argv, @@ -98,6 +117,7 @@ int parse_args( struct timeval *delay, int *humanize_mem ) { + const char *argv0 = *argv; for (argc--, argv++; argc > 0; argc--, argv++) { if (strncmp(*argv, "--pid", 5) == 0) argc = parse_arg_pid(argc, &argv, pids); @@ -105,12 +125,20 @@ int parse_args( argc = parse_arg_delay(argc, &argv, delay); else if (strcmp(*argv, "--humanize") == 0) *humanize_mem = 1; - else + else if (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0) { + if (pids->len > 0) + free(pids->data); + print_help_and_exit(argv0); + } else argc = -1; if (argc == -1) { fprintf(stderr, "Error: Could not process argument: '%s'\n", *argv); return -1; } } + if (pids->len == 0) { + fprintf(stderr, "Error: At least one pid must be passed.\n"); + return -1; + } return 0; } diff --git a/perftrace.c b/perftrace.c index 20eddb7..9a77228 100644 --- a/perftrace.c +++ b/perftrace.c @@ -477,7 +477,9 @@ int main(int argc, char *argv[]) { setup_signal_handler(SIGALRM, handle_alarm) < 0 || setup_signal_handler(SIGINT, handle_int) < 0 ) - goto error; + return EXIT_FAILURE; + if (parse_args(argc, argv, &pids, &delay, &humanize_mem) < 0) + return EXIT_FAILURE; if ( setitimer( ITIMER_REAL, &(struct itimerval){ delay, delay }, NULL @@ -486,8 +488,6 @@ int main(int argc, char *argv[]) { perror("setitimer"); goto error; } - if (parse_args(argc, argv, &pids, &delay, &humanize_mem) < 0) - return EXIT_FAILURE; printf("[\n"); for (alarm_set = 0; alarm_await(); alarm_set = 0) { if (clock_gettime(CLOCK_REALTIME, ¤t) < 0) { -- 2.53.0