rsyscall is a library which provides a interface to an ever-growing subset of Linux system calls. This interface is:
- process-independent: all system calls are called as methods on process objects, which can refer to the “local” process or to other processes under our control, possibly on remote hosts.
- type-safe: many Linux API constraints, which are usually left to user code to enforce, are made explicit in the type system.
- low-level: any action which is possible with the underlying Linux APIs, is possible with rsyscall; nothing is forbidden or discouraged.
For more detail on the concepts and motivation behind rsyscall, read the conceptual introduction.
Check out the docs at rsyscall.org.
Note that the rsyscall Python API uses some recent Python 3 features: async/await and type annotations. If you haven’t seen those before, skim the background tutorial first.
There’s no official release of rsyscall yet.
But, if you want to try it, you can do so with Nix:
git clone https://github.com/catern/rsyscall
cd rsyscall/python
nix-shell
python
Or you can build it by hand in a virtual environment:
git clone https://github.com/catern/rsyscall
cd rsyscall
python3 -m venv venv
. venv/bin/activate
pip install -U pip
cd c
autoreconf -fvi
./configure --prefix=$PWD/../venv
make install
cd ..
export LD_LIBRARY_PATH=$PWD/venv/lib
export PKG_CONFIG_PATH=$PWD/venv/lib/pkgconfig
pip install -e python/
python
rsyscall is an async library that uses Trio, so the easiest way to try it out is with an async Python REPL. IPython provides a convenient REPL:
$ pip install ipython $ ipython In [1]: %autoawait trio In [2]: import rsyscall In [3]: t = await rsyscall.local_process.fork() In [4]: await t.stdout.write(await t.ptr("Hello world!\n")) Hello world!
irc://irc.oftc.net/#rsyscall