Tools: properly handle the keyboard interrupt (#2083)

Many tools rely on the user to type Ctrl-C to end, but don't actually
catch the keyboard interrupt and thus show an ugly backtrace when it
happens. Let's catch the interrupt.
diff --git a/tools/bashreadline.py b/tools/bashreadline.py
index 89c37c3..da9c1b7 100755
--- a/tools/bashreadline.py
+++ b/tools/bashreadline.py
@@ -61,4 +61,7 @@
 
 b["events"].open_perf_buffer(print_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/biosnoop.py b/tools/biosnoop.py
index d036c0b..259a81b 100755
--- a/tools/biosnoop.py
+++ b/tools/biosnoop.py
@@ -187,4 +187,7 @@
 # loop with callback to print_event
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/btrfsslower.py b/tools/btrfsslower.py
index d48e04c..0a59820 100755
--- a/tools/btrfsslower.py
+++ b/tools/btrfsslower.py
@@ -352,4 +352,7 @@
 # read events
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/capable.py b/tools/capable.py
index 7c98267..65ffa77 100755
--- a/tools/capable.py
+++ b/tools/capable.py
@@ -216,4 +216,7 @@
 callback = partial(print_event, b)
 b["events"].open_perf_buffer(callback)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/criticalstat.py b/tools/criticalstat.py
index e45731c..68c16f7 100755
--- a/tools/criticalstat.py
+++ b/tools/criticalstat.py
@@ -328,4 +328,7 @@
     ('preempt' if preemptoff else 'IRQ'), args.duration))
 
 while 1:
-    b.perf_buffer_poll();
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/dbslower.py b/tools/dbslower.py
index 92d4127..24e6394 100755
--- a/tools/dbslower.py
+++ b/tools/dbslower.py
@@ -230,4 +230,7 @@
 
 bpf["events"].open_perf_buffer(print_event, page_cnt=64)
 while True:
-    bpf.perf_buffer_poll()
+    try:
+        bpf.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/dcsnoop.py b/tools/dcsnoop.py
index 13152c2..4c37571 100755
--- a/tools/dcsnoop.py
+++ b/tools/dcsnoop.py
@@ -162,4 +162,7 @@
 
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/execsnoop.py b/tools/execsnoop.py
index 6fdde97..0c2c065 100755
--- a/tools/execsnoop.py
+++ b/tools/execsnoop.py
@@ -246,4 +246,7 @@
 # loop with callback to print_event
 b["events"].open_perf_buffer(print_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/ext4slower.py b/tools/ext4slower.py
index 88db831..16b56ec 100755
--- a/tools/ext4slower.py
+++ b/tools/ext4slower.py
@@ -356,4 +356,7 @@
 # read events
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/filelife.py b/tools/filelife.py
index 410659d..f66f00b 100755
--- a/tools/filelife.py
+++ b/tools/filelife.py
@@ -141,4 +141,7 @@
 
 b["events"].open_perf_buffer(print_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/fileslower.py b/tools/fileslower.py
index 25443a2..ce7132a 100755
--- a/tools/fileslower.py
+++ b/tools/fileslower.py
@@ -250,4 +250,7 @@
 
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/funcslower.py b/tools/funcslower.py
index f2f08de..283c801 100755
--- a/tools/funcslower.py
+++ b/tools/funcslower.py
@@ -330,4 +330,7 @@
 
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while True:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/gethostlatency.py b/tools/gethostlatency.py
index 3a967ae..8d07e23 100755
--- a/tools/gethostlatency.py
+++ b/tools/gethostlatency.py
@@ -135,4 +135,7 @@
 # loop with callback to print_event
 b["events"].open_perf_buffer(print_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/inject.py b/tools/inject.py
index 741a0fb..bf07a8f 100755
--- a/tools/inject.py
+++ b/tools/inject.py
@@ -507,7 +507,10 @@
 
     def _main_loop(self):
         while True:
-            self.bpf.perf_buffer_poll()
+            try:
+                self.bpf.perf_buffer_poll()
+            except KeyboardInterrupt:
+                exit()
 
     def run(self):
         self._create_probes()
diff --git a/tools/killsnoop.py b/tools/killsnoop.py
index d60c72e..16221a2 100755
--- a/tools/killsnoop.py
+++ b/tools/killsnoop.py
@@ -145,4 +145,7 @@
 # loop with callback to print_event
 b["events"].open_perf_buffer(print_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/lib/uflow.py b/tools/lib/uflow.py
index 02cad55..63fab87 100755
--- a/tools/lib/uflow.py
+++ b/tools/lib/uflow.py
@@ -206,4 +206,7 @@
 
 bpf["calls"].open_perf_buffer(print_event)
 while 1:
-    bpf.perf_buffer_poll()
+    try:
+        bpf.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/lib/ugc.py b/tools/lib/ugc.py
index 8288910..8841d5f 100755
--- a/tools/lib/ugc.py
+++ b/tools/lib/ugc.py
@@ -244,4 +244,7 @@
 
 bpf["gcs"].open_perf_buffer(print_event)
 while 1:
-    bpf.perf_buffer_poll()
+    try:
+        bpf.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/lib/uthreads.py b/tools/lib/uthreads.py
index 71e9c6a..90d0a74 100755
--- a/tools/lib/uthreads.py
+++ b/tools/lib/uthreads.py
@@ -128,4 +128,7 @@
 
 bpf["threads"].open_perf_buffer(print_event)
 while 1:
-    bpf.perf_buffer_poll()
+    try:
+        bpf.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/mdflush.py b/tools/mdflush.py
index 70afc4d..485635d 100755
--- a/tools/mdflush.py
+++ b/tools/mdflush.py
@@ -78,4 +78,7 @@
 # read events
 b["events"].open_perf_buffer(print_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/mountsnoop.py b/tools/mountsnoop.py
index e9b5865..f78fe0b 100755
--- a/tools/mountsnoop.py
+++ b/tools/mountsnoop.py
@@ -414,7 +414,11 @@
     print('{:16} {:<7} {:<7} {:<11} {}'.format(
         'COMM', 'PID', 'TID', 'MNT_NS', 'CALL'))
     while True:
-        b.perf_buffer_poll()
+        try:
+            b.perf_buffer_poll()
+        except KeyboardInterrupt:
+            exit()
+
 
 
 if __name__ == '__main__':
diff --git a/tools/mysqld_qslower.py b/tools/mysqld_qslower.py
index d760773..ab23b5b 100755
--- a/tools/mysqld_qslower.py
+++ b/tools/mysqld_qslower.py
@@ -130,4 +130,7 @@
 # loop with callback to print_event
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/nfsslower.py b/tools/nfsslower.py
index 2f92c90..32e91c7 100755
--- a/tools/nfsslower.py
+++ b/tools/nfsslower.py
@@ -325,4 +325,7 @@
 
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
+    try:
         b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/oomkill.py b/tools/oomkill.py
index 0677e49..db3a537 100755
--- a/tools/oomkill.py
+++ b/tools/oomkill.py
@@ -77,4 +77,7 @@
 print("Tracing OOM kills... Ctrl-C to stop.")
 b["events"].open_perf_buffer(print_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/opensnoop.py b/tools/opensnoop.py
index 418d47b..818c602 100755
--- a/tools/opensnoop.py
+++ b/tools/opensnoop.py
@@ -191,4 +191,7 @@
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 start_time = datetime.now()
 while not args.duration or datetime.now() - start_time < args.duration:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/runqslower.py b/tools/runqslower.py
index 7a1869c..7af12e5 100755
--- a/tools/runqslower.py
+++ b/tools/runqslower.py
@@ -254,4 +254,7 @@
 # read events
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/solisten.py b/tools/solisten.py
index 6a35f82..e816890 100755
--- a/tools/solisten.py
+++ b/tools/solisten.py
@@ -210,4 +210,7 @@
 
     # Read events
     while 1:
-        b.perf_buffer_poll()
+        try:
+            b.perf_buffer_poll()
+        except KeyboardInterrupt:
+            exit()
diff --git a/tools/sslsniff.py b/tools/sslsniff.py
index 0c9f976..265e87f 100755
--- a/tools/sslsniff.py
+++ b/tools/sslsniff.py
@@ -228,4 +228,7 @@
 b["perf_SSL_write"].open_perf_buffer(print_event_write)
 b["perf_SSL_read"].open_perf_buffer(print_event_read)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/statsnoop.py b/tools/statsnoop.py
index 4e62ebd..516eda2 100755
--- a/tools/statsnoop.py
+++ b/tools/statsnoop.py
@@ -179,4 +179,7 @@
 # loop with callback to print_event
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/syncsnoop.py b/tools/syncsnoop.py
index ba3f1d3..708fbc4 100755
--- a/tools/syncsnoop.py
+++ b/tools/syncsnoop.py
@@ -50,4 +50,7 @@
 # loop with callback to print_event
 b["events"].open_perf_buffer(print_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/tcpaccept.py b/tools/tcpaccept.py
index 884b0c5..e278075 100755
--- a/tools/tcpaccept.py
+++ b/tools/tcpaccept.py
@@ -270,4 +270,7 @@
 b["ipv4_events"].open_perf_buffer(print_ipv4_event)
 b["ipv6_events"].open_perf_buffer(print_ipv6_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/tcpconnect.py b/tools/tcpconnect.py
index ac84326..13c987b 100755
--- a/tools/tcpconnect.py
+++ b/tools/tcpconnect.py
@@ -237,4 +237,7 @@
 b["ipv4_events"].open_perf_buffer(print_ipv4_event)
 b["ipv6_events"].open_perf_buffer(print_ipv6_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/tcpconnlat.py b/tools/tcpconnlat.py
index 0d21b83..9f25f0f 100755
--- a/tools/tcpconnlat.py
+++ b/tools/tcpconnlat.py
@@ -264,4 +264,7 @@
 b["ipv4_events"].open_perf_buffer(print_ipv4_event)
 b["ipv6_events"].open_perf_buffer(print_ipv6_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/tcpdrop.py b/tools/tcpdrop.py
index d9fbdf5..ca89be6 100755
--- a/tools/tcpdrop.py
+++ b/tools/tcpdrop.py
@@ -221,4 +221,7 @@
 b["ipv4_events"].open_perf_buffer(print_ipv4_event)
 b["ipv6_events"].open_perf_buffer(print_ipv6_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/tcplife.py b/tools/tcplife.py
index 51ed7ae..4639582 100755
--- a/tools/tcplife.py
+++ b/tools/tcplife.py
@@ -506,4 +506,7 @@
 b["ipv4_events"].open_perf_buffer(print_ipv4_event, page_cnt=64)
 b["ipv6_events"].open_perf_buffer(print_ipv6_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/tcpretrans.py b/tools/tcpretrans.py
index 4400483..47ac8c1 100755
--- a/tools/tcpretrans.py
+++ b/tools/tcpretrans.py
@@ -303,4 +303,7 @@
     b["ipv4_events"].open_perf_buffer(print_ipv4_event)
     b["ipv6_events"].open_perf_buffer(print_ipv6_event)
     while 1:
-        b.perf_buffer_poll()
+        try:
+            b.perf_buffer_poll()
+        except KeyboardInterrupt:
+            exit()
diff --git a/tools/tcpstates.py b/tools/tcpstates.py
index 1444b31..4a21f02 100755
--- a/tools/tcpstates.py
+++ b/tools/tcpstates.py
@@ -386,4 +386,7 @@
 b["ipv4_events"].open_perf_buffer(print_ipv4_event, page_cnt=64)
 b["ipv6_events"].open_perf_buffer(print_ipv6_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/tcptracer.py b/tools/tcptracer.py
index 16bb4b1..cc92c3f 100755
--- a/tools/tcptracer.py
+++ b/tools/tcptracer.py
@@ -662,4 +662,7 @@
 b["tcp_ipv4_event"].open_perf_buffer(print_ipv4_event)
 b["tcp_ipv6_event"].open_perf_buffer(print_ipv6_event)
 while True:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/ttysnoop.py b/tools/ttysnoop.py
index 9780518..07f272f 100755
--- a/tools/ttysnoop.py
+++ b/tools/ttysnoop.py
@@ -121,4 +121,7 @@
 # loop with callback to print_event
 b["events"].open_perf_buffer(print_event)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/xfsslower.py b/tools/xfsslower.py
index c70721a..b79527b 100755
--- a/tools/xfsslower.py
+++ b/tools/xfsslower.py
@@ -303,4 +303,7 @@
 # read events
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()
diff --git a/tools/zfsslower.py b/tools/zfsslower.py
index 8ab283a..7bf160b 100755
--- a/tools/zfsslower.py
+++ b/tools/zfsslower.py
@@ -315,4 +315,7 @@
 # read events
 b["events"].open_perf_buffer(print_event, page_cnt=64)
 while 1:
-    b.perf_buffer_poll()
+    try:
+        b.perf_buffer_poll()
+    except KeyboardInterrupt:
+        exit()