}
if (signal(SIGINT, sig_int) == SIG_ERR) {
- warn("can't set signal handler: %s\n", strerror(-errno));
+ warn("can't set signal handler: %s\n", strerror(errno));
+ err = 1;
goto cleanup;
}
printf("%-7s %-16s %-3s %-5s %-5s %-4s %-5s %-48s\n",
"PID", "COMM", "RET", "PROTO", "OPTS", "IF", "PORT", "ADDR");
- while (1) {
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
- if (exiting)
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ warn("error polling perf buffer: %s\n", strerror(errno));
goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- warn("error polling perf buffer: %d\n", err);
cleanup:
+ perf_buffer__free(pb);
bindsnoop_bpf__destroy(obj);
return err != 0;
// Based on biosnoop(8) from BCC by Brendan Gregg.
// 29-Jun-2020 Wenbo Zhang Created this.
#include <argp.h>
+#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#define PERF_BUFFER_PAGES 16
#define PERF_POLL_TIMEOUT_MS 100
+static volatile sig_atomic_t exiting = 0;
+
static struct env {
char *disk;
int duration;
return vfprintf(stderr, format, args);
}
+static void sig_int(int signo)
+{
+ exiting = 1;
+}
+
static void blk_fill_rwbs(char *rwbs, unsigned int op)
{
int i = 0;
if (env.duration)
time_end = get_ktime_ns() + env.duration * NSEC_PER_SEC;
+ if (signal(SIGINT, sig_int) == SIG_ERR) {
+ fprintf(stderr, "can't set signal handler: %s\n", strerror(errno));
+ err = 1;
+ goto cleanup;
+ }
+
/* main: poll */
- while (1) {
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
+ goto cleanup;
+ }
if (env.duration && get_ktime_ns() > time_end)
goto cleanup;
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- printf("error polling perf buffer: %d\n", err);
cleanup:
+ perf_buffer__free(pb);
biosnoop_bpf__destroy(obj);
ksyms__free(ksyms);
partitions__free(partitions);
// Based on drsnoop(8) from BCC by Wenbo Zhang.
// 28-Feb-2020 Wenbo Zhang Created this.
#include <argp.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PERF_BUFFER_PAGES 16
#define PERF_POLL_TIMEOUT_MS 100
+static volatile sig_atomic_t exiting = 0;
+
static struct env {
pid_t pid;
pid_t tid;
return vfprintf(stderr, format, args);
}
+static void sig_int(int signo)
+{
+ exiting = 1;
+}
+
void handle_event(void *ctx, int cpu, void *data, __u32 data_sz)
{
const struct event *e = data;
if (env.duration)
time_end = get_ktime_ns() + env.duration * NSEC_PER_SEC;
+ if (signal(SIGINT, sig_int) == SIG_ERR) {
+ fprintf(stderr, "can't set signal handler: %s\n", strerror(errno));
+ err = 1;
+ goto cleanup;
+ }
+
/* main: poll */
- while (1) {
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
+ goto cleanup;
+ }
if (env.duration && get_ktime_ns() > time_end)
goto cleanup;
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- printf("error polling perf buffer: %d\n", err);
cleanup:
perf_buffer__free(pb);
// Based on execsnoop(8) from BCC by Brendan Gregg and others.
//
#include <argp.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "trace_helpers.h"
#define PERF_BUFFER_PAGES 64
+#define PERF_POLL_TIMEOUT_MS 100
#define NSEC_PRECISION (NSEC_PER_SEC / 1000)
#define MAX_ARGS_KEY 259
+static volatile sig_atomic_t exiting = 0;
+
static struct env {
bool time;
bool timestamp;
return vfprintf(stderr, format, args);
}
+static void sig_int(int signo)
+{
+ exiting = 1;
+}
+
static void time_since_start()
{
long nsec, sec;
goto cleanup;
}
+ if (signal(SIGINT, sig_int) == SIG_ERR) {
+ fprintf(stderr, "can't set signal handler: %s\n", strerror(errno));
+ err = 1;
+ goto cleanup;
+ }
+
/* main: poll */
- while ((err = perf_buffer__poll(pb, 100)) >= 0)
- ;
- printf("Error polling perf buffer: %d\n", err);
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
+ goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
+ }
cleanup:
perf_buffer__free(pb);
}
if (signal(SIGINT, sig_int) == SIG_ERR) {
- warn("can't set signal handler: %s\n", strerror(-errno));
+ warn("can't set signal handler: %s\n", strerror(errno));
+ err = 1;
goto cleanup;
}
printf("%-16s %-7s %-7s %-7s %-7s %-s\n",
"PCOMM", "PID", "PPID", "TID", "AGE(s)", "EXIT_CODE");
- while (1) {
+ while (!exiting) {
err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
- if (err == -EINTR) {
- err = 0;
- goto cleanup;
- }
-
- if (err < 0)
- break;
- if (exiting)
+ if (err < 0 && errno != EINTR) {
+ warn("error polling perf buffer: %s\n", strerror(errno));
goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- warn("error polling perf buffer: %d\n", err);
cleanup:
perf_buffer__free(pb);
// Based on filelife(8) from BCC by Brendan Gregg & Allan McAleavy.
// 20-Mar-2020 Wenbo Zhang Created this.
#include <argp.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PERF_BUFFER_PAGES 16
#define PERF_POLL_TIMEOUT_MS 100
+static volatile sig_atomic_t exiting = 0;
+
static struct env {
pid_t pid;
bool verbose;
return vfprintf(stderr, format, args);
}
+static void sig_int(int signo)
+{
+ exiting = 1;
+}
+
void handle_event(void *ctx, int cpu, void *data, __u32 data_sz)
{
const struct event *e = data;
goto cleanup;
}
- while ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) >= 0)
- ;
- fprintf(stderr, "error polling perf buffer: %d\n", err);
+ if (signal(SIGINT, sig_int) == SIG_ERR) {
+ fprintf(stderr, "can't set signal handler: %s\n", strerror(errno));
+ err = 1;
+ goto cleanup;
+ }
+
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
+ goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
+ }
cleanup:
perf_buffer__free(pb);
}
if (signal(SIGINT, sig_int) == SIG_ERR) {
- warn("can't set signal handler: %s\n", strerror(-errno));
+ warn("can't set signal handler: %s\n", strerror(errno));
+ err = 1;
goto cleanup;
}
[FSYNC] = 'F',
};
-static volatile sig_atomic_t exiting;
+static volatile sig_atomic_t exiting = 0;
/* options */
static enum fs_type fs_type = NONE;
return vfprintf(stderr, format, args);
}
-static void sig_handler(int sig)
+static void sig_int(int signo)
{
exiting = 1;
}
goto cleanup;
}
- signal(SIGINT, sig_handler);
-
pb_opts.sample_cb = handle_event;
pb_opts.lost_cb = handle_lost_events;
pb = perf_buffer__new(bpf_map__fd(skel->maps.events), PERF_BUFFER_PAGES,
if (duration)
time_end = get_ktime_ns() + duration * NSEC_PER_SEC;
- while (1) {
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
+ if (signal(SIGINT, sig_int) == SIG_ERR) {
+ warn("can't set signal handler: %s\n", strerror(errno));
+ err = 1;
+ goto cleanup;
+ }
+
+ /* main: poll */
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
+ goto cleanup;
+ }
if (duration && get_ktime_ns() > time_end)
goto cleanup;
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- warn("failed with polling perf buffer: %d\n", err);
cleanup:
perf_buffer__free(pb);
#define warn(...) fprintf(stderr, __VA_ARGS__)
static volatile sig_atomic_t exiting = 0;
+
static pid_t target_pid = 0;
static const char *libc_path = NULL;
}
if (signal(SIGINT, sig_int) == SIG_ERR) {
- warn("can't set signal handler: %s\n", strerror(-errno));
+ warn("can't set signal handler: %s\n", strerror(errno));
+ err = 1;
goto cleanup;
}
printf("%-8s %-7s %-16s %-10s %-s\n",
"TIME", "PID", "COMM", "LATms", "HOST");
- while (1) {
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
- if (exiting)
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ warn("error polling perf buffer: %s\n", strerror(errno));
goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- warn("error polling perf buffer: %d\n", err);
cleanup:
perf_buffer__free(pb);
#include <ctype.h>
#include <errno.h>
#include <getopt.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define KSNOOP_VERSION "0.1"
#endif
+static volatile sig_atomic_t exiting = 0;
+
static struct btf *vmlinux_btf;
static const char *bin_name;
static int pages = PAGES_DEFAULT;
p_err("\t/* lost %llu events */", cnt);
}
+static void sig_int(int signo)
+{
+ exiting = 1;
+}
+
static int add_traces(struct bpf_map *func_map, struct trace *traces,
int nr_traces)
{
printf("%16s %4s %8s %s\n", "TIME", "CPU", "PID", "FUNCTION/ARGS");
- while (1) {
+ if (signal(SIGINT, sig_int) == SIG_ERR) {
+ fprintf(stderr, "can't set signal handler: %s\n", strerror(errno));
+ ret = 1;
+ goto cleanup;
+ }
+
+ while (!exiting) {
ret = perf_buffer__poll(pb, 1);
- if (ret < 0 && ret != -EINTR) {
- p_err("Polling failed: %s", strerror(-ret));
- break;
+ if (ret < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
+ goto cleanup;
}
+ /* reset ret to return 0 if exiting */
+ ret = 0;
}
+cleanup:
perf_buffer__free(pb);
ksnoop_bpf__destroy(skel);
}
if (signal(SIGINT, sig_int) == SIG_ERR) {
- warn("can't set signal handler: %s\n", strerror(-errno));
+ warn("can't set signal handler: %s\n", strerror(errno));
+ err = 1;
goto cleanup;
}
printf("%-16s %-7s %-7s %-11s %s\n", "COMM", "PID", "TID", "MNT_NS", "CALL");
}
- while (1) {
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
- if (exiting)
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- warn("error polling perf buffer: %d\n", err);
cleanup:
perf_buffer__free(pb);
// Based on opensnoop(8) from BCC by Brendan Gregg and others.
// 14-Feb-2020 Brendan Gregg Created this.
#include <argp.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NSEC_PER_SEC 1000000000ULL
+static volatile sig_atomic_t exiting = 0;
+
static struct env {
pid_t pid;
pid_t tid;
return vfprintf(stderr, format, args);
}
+static void sig_int(int signo)
+{
+ exiting = 1;
+}
+
void handle_event(void *ctx, int cpu, void *data, __u32 data_sz)
{
const struct event *e = data;
if (env.duration)
time_end = get_ktime_ns() + env.duration * NSEC_PER_SEC;
+ if (signal(SIGINT, sig_int) == SIG_ERR) {
+ fprintf(stderr, "can't set signal handler: %s\n", strerror(errno));
+ err = 1;
+ goto cleanup;
+ }
+
/* main: poll */
- while (1) {
- usleep(PERF_BUFFER_TIME_MS * 1000);
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
+ goto cleanup;
+ }
if (env.duration && get_ktime_ns() > time_end)
goto cleanup;
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- printf("Error polling perf buffer: %d\n", err);
cleanup:
perf_buffer__free(pb);
// Based on runqslower(8) from BCC by Ivan Babrou.
// 11-Feb-2020 Andrii Nakryiko Created this.
#include <argp.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "runqslower.skel.h"
#include "trace_helpers.h"
+static volatile sig_atomic_t exiting = 0;
+
struct env {
pid_t pid;
pid_t tid;
return vfprintf(stderr, format, args);
}
+static void sig_int(int signo)
+{
+ exiting = 1;
+}
+
void handle_event(void *ctx, int cpu, void *data, __u32 data_sz)
{
const struct event *e = data;
goto cleanup;
}
- while ((err = perf_buffer__poll(pb, 100)) >= 0)
- ;
- printf("Error polling perf buffer: %d\n", err);
+ if (signal(SIGINT, sig_int) == SIG_ERR) {
+ fprintf(stderr, "can't set signal handler: %s\n", strerror(errno));
+ err = 1;
+ goto cleanup;
+ }
+
+ while (!exiting) {
+ err = perf_buffer__poll(pb, 100);
+ if (err < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
+ goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
+ }
cleanup:
perf_buffer__free(pb);
}
if (signal(SIGINT, sig_int) == SIG_ERR) {
- warn("can't set signal handler: %s\n", strerror(-errno));
+ warn("can't set signal handler: %s\n", strerror(errno));
+ err = 1;
goto cleanup;
}
printf("%-7s %-16s %-3s %-7s %-5s %-5s %-32s\n",
"PID", "COMM", "RET", "BACKLOG", "PROTO", "PORT", "ADDR");
- while (1) {
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
- if (exiting)
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ warn("error polling perf buffer: %s\n", strerror(errno));
goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- warn("error polling perf buffer: %d\n", err);
cleanup:
perf_buffer__free(pb);
}
if (signal(SIGINT, sig_int) == SIG_ERR) {
- warn("can't set signal handler: %s\n", strerror(-errno));
+ warn("can't set signal handler: %s\n", strerror(errno));
+ err = 1;
goto cleanup;
}
printf("%-7s %-20s %-4s %-4s %-s\n",
"PID", "COMM", "RET", "ERR", "PATH");
- while (1) {
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
- if (exiting)
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ warn("error polling perf buffer: %s\n", strerror(errno));
goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- warn("error polling perf buffer: %d\n", err);
cleanup:
+ perf_buffer__free(pb);
statsnoop_bpf__destroy(obj);
return err != 0;
#define warn(...) fprintf(stderr, __VA_ARGS__)
+static volatile sig_atomic_t exiting = 0;
+
const char *argp_program_version = "tcpconnect 0.1";
const char *argp_program_bug_address =
"https://github.com/iovisor/bcc/tree/master/libbpf-tools";
return vfprintf(stderr, format, args);
}
-static volatile sig_atomic_t hang_on = 1;
-
static void sig_int(int signo)
{
- hang_on = 0;
+ exiting = 1;
}
static void print_count_ipv4(int map_fd)
{
static const char *header_fmt = "\n%-25s %-25s %-20s %-10s\n";
- while (hang_on)
+ while (!exiting)
pause();
printf(header_fmt, "LADDR", "RADDR", "RPORT", "CONNECTS");
}
print_events_header();
- while (hang_on) {
+ while (!exiting) {
err = perf_buffer__poll(pb, 100);
if (err < 0 && errno != EINTR) {
- warn("Error polling perf buffer: %d\n", err);
+ warn("error polling perf buffer: %s\n", strerror(errno));
goto cleanup;
}
+ /* reset err to return 0 if exiting */
+ err = 0;
}
cleanup:
}
if (signal(SIGINT, sig_int) == SIG_ERR) {
- warn("can't set signal handler: %s\n", strerror(-errno));
+ warn("can't set signal handler: %s\n", strerror(errno));
+ err = 1;
goto cleanup;
}
// 11-Jul-2020 Wenbo Zhang Created this.
#include <argp.h>
#include <arpa/inet.h>
+#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#define PERF_BUFFER_PAGES 16
#define PERF_POLL_TIMEOUT_MS 100
+static volatile sig_atomic_t exiting = 0;
+
static struct env {
__u64 min_us;
pid_t pid;
return vfprintf(stderr, format, args);
}
+static void sig_int(int signo)
+{
+ exiting = 1;
+}
+
void handle_event(void *ctx, int cpu, void *data, __u32 data_sz)
{
const struct event *e = data;
printf("%-6s %-12s %-2s %-16s %-16s %-5s %s\n",
"PID", "COMM", "IP", "SADDR", "DADDR", "DPORT", "LAT(ms)");
+ if (signal(SIGINT, sig_int) == SIG_ERR) {
+ fprintf(stderr, "can't set signal handler: %s\n", strerror(errno));
+ err = 1;
+ goto cleanup;
+ }
+
/* main: poll */
- while (1) {
- if ((err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS)) < 0)
- break;
+ while (!exiting) {
+ err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
+ if (err < 0 && errno != EINTR) {
+ fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno));
+ goto cleanup;
+ }
+ /* reset err to return 0 if exiting */
+ err = 0;
}
- printf("error polling perf buffer: %d\n", err);
cleanup:
+ perf_buffer__free(pb);
tcpconnlat_bpf__destroy(obj);
return err != 0;