go-libproc
Golang bindings for macOS / OS X libproc
Status
go-libproc has raw bindings for the complete C API as of macOS 10.12. That said, it could use many more high-level functions.
FAQ
What's libproc?
libproc
is a macOS (Darwin) shared library that exposes internal kernel data
about running processes. It's the Mac-equivalent of Linux's [procps]
and powers many utilities like ps
and lsof
.
How does it work?
go-libproc uses Cgo to call an intermediate C wrapper
that calls libproc
. While Cgo can be used to call libproc
directly from Go,
later versions of OS X contain additional functions so the C wrapper uses dlopen
and 'dlsym' to load libproc.dylib
dynamic shared library at runtime. This allows go-libproc to return
ErrFunctionUnavailable
from unavailable functions rather than failing to compile on
systems missing some function implementations.
What methods should I use?
Methods prefixed with RawProc
(e.g. RawProcListPIDs
) defined in bindings.go
are low-level wrappers of the C API and are very unlikely to change.
However, they're inadvisable for normal usage. I recommend using the
higher-level wrappers built on top of these in libproc.go
(e.g. ListPIDs
).
If you find yourself reaching for the low-level bindings and
unsafe
code, please open an issue,
or better (assuming you want it done!), a pull request for a new high-level function.