From 95a253aa6e95fa1f8e3ed11f3a8d93c3e59aff2e Mon Sep 17 00:00:00 2001 From: Craig Small Date: Mon, 18 Jul 2022 20:51:41 +1000 Subject: [PATCH] pgrep: Better warning if pidfd_open not implemented If procps is built on a Linux 5.3+ system then pidwait is built with pidfd_open(). If that program is run on a system < 5.3 then it gives an odd generic error. If we get a ENOSYS from one pid, we will get it for all the others so its better to explain what happens and terminate. The man page is updated to note this issue. This came up due to killall in psmisc using pidfd_send_signal References: https://bugs.debian.org/1015228 Signed-off-by: Craig Small --- NEWS | 1 + pgrep.1 | 8 ++++++-- pgrep.c | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index e3e7148c..d395bc08 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ procps-ng-NEXT * library Re-add elogind support merge #151 Used memory is Total - Available + * pidwait: Better warning if pidfd_open not implemented * pmap: Dont reuse stdin filehandle issue #231 * ps: threads again display when -L is used with -q issue #234 * ps: proper aix format string behavior was restored diff --git a/pgrep.1 b/pgrep.1 index e29e6e1a..5e1db7f2 100644 --- a/pgrep.1 +++ b/pgrep.1 @@ -7,7 +7,7 @@ .\" the Free Software Foundation; either version 2 of the License, or .\" (at your option) any later version. .\" -.TH PGREP "1" "2021-12-25" "procps-ng" "User Commands" +.TH PGREP "1" "2022-07-18" "procps-ng" "User Commands" .SH NAME pgrep, pkill, pidwait \- look up, signal, or wait for processes based on name and other attributes .SH SYNOPSIS @@ -281,7 +281,11 @@ can not be combined. Let me know if you need to do this. .PP Defunct processes are reported. - +.PP +.B pidwait +requires the +.BR pidfd_open (2) +system call which first appeared in Linux 5.3. .SH "SEE ALSO" .BR ps (1), .BR regex (7), diff --git a/pgrep.c b/pgrep.c index 328873b1..3a01c789 100644 --- a/pgrep.c +++ b/pgrep.c @@ -1064,6 +1064,8 @@ int main (int argc, char **argv) printf(_("waiting for %s (pid %lu)\n"), procs[i].str, procs[i].num); int pidfd = pidfd_open(procs[i].num, 0); if (pidfd == -1) { + if (errno == ENOSYS) + xerrx(EXIT_FAILURE, _("pidfd_open() not implemented in Linux < 5.3")); /* ignore ESRCH, same as pkill */ if (errno != ESRCH) xwarn(_("opening pid %ld failed"), procs[i].num);