From 6c87a3ac5ee96194e0e461db24b1bbfe369bdb59 Mon Sep 17 00:00:00 2001 From: Jesse Rosenstock Date: Fri, 27 Jun 2025 09:47:35 +0200 Subject: [PATCH] taskset: Accept 0 pid for current process This is useful to print the current mask without using `$$`: `taskset -p 0`. It is also helpful to test taskset: `taskset -c 1-4 taskset -p 0`. This is not easy with `$$`. sched_setaffinity(2)/sched_getaffinity(2) accept 0 for the calling thread, so this seems consistent. As an implementation detail, we replace 0 with getpid(), so the existing pid != 0 <==> "will exec" logic continues to work unchanged. A reasonable alternative would be to interpret just `taskset` (currently an error) as printing the current mask. This seems less orthogonal, and a better use may be found for plain `taskset` in the future. Signed-off-by: Jesse Rosenstock --- schedutils/taskset.1.adoc | 8 ++++++++ schedutils/taskset.c | 13 ++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/schedutils/taskset.1.adoc b/schedutils/taskset.1.adoc index 938434737..45622613b 100644 --- a/schedutils/taskset.1.adoc +++ b/schedutils/taskset.1.adoc @@ -77,6 +77,7 @@ Interpret _mask_ as numerical list of processors instead of a bitmask. Numbers a *-p*, *--pid*:: Operate on an existing PID and do not launch a new task. +If PID is zero, then operate on the *taskset* process. include::man-common/help-version.adoc[] @@ -134,6 +135,13 @@ taskset: failed to set pid 14's affinity: Invalid argument + $ echo $? + 1 + +== EXAMPLES + +Print the current CPU affinity as a list. + +$ taskset -pc 0 + +pid 1355988's current affinity list: 0-47 + + == AUTHORS Written by Robert M. Love. diff --git a/schedutils/taskset.c b/schedutils/taskset.c index b52cd4338..7e2ecc336 100644 --- a/schedutils/taskset.c +++ b/schedutils/taskset.c @@ -186,7 +186,18 @@ int main(int argc, char **argv) all_tasks = 1; break; case 'p': - pid = strtopid_or_err(argv[argc - 1], _("invalid PID argument")); + /* + * strtopid_or_err() is not suitable here; 0 can be + * passed. + */ + pid = strtos32_or_err(argv[argc - 1], + _("invalid PID argument")); + if (pid == 0) + pid = getpid(); + /* + * After this point, pid == 0 means "no pid" and that + * we will exec a command. + */ break; case 'c': ts.use_list = 1; -- 2.39.5