pbind(8) on Solnix vs Linux and the BSDs

pbind is the illumos command at /usr/sbin/pbind. It binds processes or LWPs to a processor by numeric processor ID, queries those bindings and removes them. It is not a flag-for-flag match for Linux taskset, FreeBSD cpuset or NetBSD schedctl: it binds to one processor ID, not to a mask or CPU list.

What Solnix runs

A default Solnix system runs the illumos pbind at /usr/sbin/pbind. No other variants are shipped. Use psrinfo(8) to see which processors are available, and psrset(8) for processor sets.

Differences

Compared withTopicWhat differs
Linux, FreeBSD, NetBSDone processor vs a setSolnix pbind -b and -e take a single processor_id, which must be present and on-line. Linux taskset takes a hex mask or a --cpu-list. FreeBSD cpuset -l takes a cpu-list. NetBSD schedctl -A takes comma-separated processors.
Source: Solnix pbind(8) SYNOPSIS, DESCRIPTION; Linux taskset(1) -c; FreeBSD cpuset(1) -l; NetBSD schedctl(8) -A
Linux, FreeBSD, NetBSDbinding is not exclusiveA bound LWP runs only on its processor, except when it needs a resource that only another processor provides. The processor can still run other LWPs. The other pages do not describe an exception for resources.
Source: Solnix pbind(8) DESCRIPTION; Linux taskset(1) DESCRIPTION; FreeBSD cpuset(1) DESCRIPTION; NetBSD schedctl(8) -A
Linux, FreeBSD, NetBSDlaunching a commandSolnix uses -e processor_id cmd [args...] to run a command bound to a processor. taskset takes mask command with no flag. cpuset takes cmd after its options. schedctl runs a command when -p is not given.
Source: Solnix pbind(8) -e; Linux taskset(1) SYNOPSIS, USAGE; FreeBSD cpuset(1) SYNOPSIS; NetBSD schedctl(8) -p
Linux, FreeBSD, NetBSD-p meaningSolnix pbind has no -p; the pid is a plain operand. On Linux, FreeBSD and NetBSD, -p introduces the target pid. A script using pbind -p fails on Solnix.
Source: Solnix pbind(8) SYNOPSIS, OPERANDS; Linux taskset(1) -p; FreeBSD cpuset(1) -p; NetBSD schedctl(8) -p
Linux, FreeBSD, NetBSDquery and unbind syntaxSolnix queries with -q (the default when no option is given), -Q for LWPs bound to given processors, and unbinds with -u or -U. Linux queries with taskset -p pid. FreeBSD queries with cpuset -g. The NetBSD page says schedctl returns current parameters, with no query flag.
Source: Solnix pbind(8) -q, -Q, -u, -U; Linux taskset(1) USAGE; FreeBSD cpuset(1) -g; NetBSD schedctl(8) DESCRIPTION
Linux, FreeBSD, NetBSDreverse query by processorSolnix pbind -Q lists the LWPs bound to given processors, and -U removes all bindings to given processors. The taskset, cpuset and schedctl pages show no equivalent per-processor query or bulk unbind.
Source: Solnix pbind(8) -Q, -U; Linux taskset(1) OPTIONS; FreeBSD cpuset(1) OPTIONS; NetBSD schedctl(8) OPTIONS
Linux, FreeBSD, NetBSDLWP and thread selectionSolnix selects LWPs by appending /lwpid to a pid, with ranges such as 2,3,4-8, -4 and 4-. Linux uses -a for all tasks of a PID. FreeBSD uses -t tid. NetBSD uses -t lid.
Source: Solnix pbind(8) OPERANDS lwpid; Linux taskset(1) -a; FreeBSD cpuset(1) -t; NetBSD schedctl(8) -t
Linux, FreeBSD, NetBSDinheritance of bindingsOn Solnix, new LWPs and processes created by a bound LWP inherit the binding, so binding a shell binds its commands. The other pages in the bundle do not state inheritance.
Source: Solnix pbind(8) DESCRIPTION; Linux taskset(1); FreeBSD cpuset(1); NetBSD schedctl(8)
NetBSDwho may change bindingsSolnix lets a superuser bind any process, and other users bind processes they may signal, meaning the same effective user ID. NetBSD schedctl says only the super-user may change scheduling parameters.
Source: Solnix pbind(8) DESCRIPTION; NetBSD schedctl(8) DESCRIPTION
FreeBSD, NetBSDscope of the toolpbind only handles processor binding. NetBSD schedctl also sets scheduling class and priority (-C, -P). FreeBSD cpuset also handles NUMA memory domain policy (-n), jails and irqs.
Source: Solnix pbind(8) DESCRIPTION; NetBSD schedctl(8) -C, -P; FreeBSD cpuset(1) -n, -j, -x
Linux, FreeBSD, NetBSDexit statusSolnix pbind exits 0 on success and >0 on error. FreeBSD cpuset documents the same. The Linux page documents 0 for success and 1 for an illegal affinity. The NetBSD page has no EXIT STATUS section.
Source: Solnix pbind(8) EXIT STATUS; FreeBSD cpuset(1) EXIT STATUS; Linux taskset(1) EXIT STATUS; NetBSD schedctl(8)

Everyday tasks

TaskSolnixLinuxFreeBSDNetBSD
run a command on one CPUpbind -e processor_id cmd [args...]taskset -c cpu-list commandcpuset -l cpu-list cmd ...schedctl -A cpus command
bind a running processpbind -b processor_id pidtaskset -pc cpu-list pidcpuset -l cpu-list -p pidschedctl -A cpus -p pid
show a process's bindingpbind -q pidtaskset -p pidcpuset -g -p pidschedctl -p pid
remove a bindingpbind -u pid——schedctl -A -1 -p pid
bind one thread or LWPpbind -b processor_id pid/lwpid—cpuset -l cpu-list -t tidschedctl -A cpus -t lid -p pid
list available processorspsrinfo(8)—cpuset -g—

Standards

  • POSIX: pbind is not a POSIX.1-2024 utility.

Writing portable scripts

  • Do not script pbind, taskset, cpuset and schedctl as one interface: the names, the processor argument form and the query syntax all differ. Branch on which tool is present.
  • On Solnix, take processor IDs from psrinfo(8), because pbind requires an existing on-line processor.

Every difference here is taken from the manual pages linked above: Solnix's published page, Linux (man-pages and the GNU and util-linux manuals), FreeBSD, OpenBSD and NetBSD. Each row names its source. Where a manual is silent, this page is too. Compiled 2026-10-26. Found a mistake? Mail hackers@lists.solnix.io.