More on linuxfd: An Example

The following short test program demonstrates the possibilities of eventfd, signalfd and timerfd in an asynchronous controlled event loop.

#!/usr/bin/env python
"""This file is part of linuxfd (Python wrapper for eventfd/signalfd/timerfd)
Copyright (C) 2014 Frank Abelbeck <>

linuxfd is free software: you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your option)
any later version.

linuxfd is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with linuxfd.  If not, see <>.

Written in Python V3."""

import linuxfd,signal,select,time

# create special file objects
efd = linuxfd.eventfd(initval=0,nonBlocking=True)
sfd = linuxfd.signalfd(signalset={signal.SIGINT},nonBlocking=True)
tfd = linuxfd.timerfd(rtc=True,nonBlocking=True)

# program timer and mask SIGINT

# create epoll instance and register special files
epl = select.epoll()

# start main loop
print("{0:.3f}: Hello!".format(time.time()))
while isrunning:
	# block until epoll detects changes in the registered files
	events = epl.poll(-1)
	t = time.time()
	# iterate over occurred events
	for fd,event in events:
		if fd == efd.fileno() and event & select.EPOLLIN:
			# event file descriptor readable: read and exit loop
			print("{0:.3f}: event file received update, exiting...".format(t))
			isrunning = False
		elif fd == sfd.fileno() and event & select.EPOLLIN:
			# signal file descriptor readable: write to event file
			siginfo =
			if siginfo["signo"] == signal.SIGINT:
				print("{0:.3f}: SIGINT received, notifying event file".format(t))
		elif fd == tfd.fileno() and event & select.EPOLLIN:
			# timer file descriptor readable: display that timer has expired
			print("{0:.3f}: timer has expired".format(t))
print("{0:.3f}: Goodbye!".format(time.time()))

In short this program features a loop which is activated if any of the three special files becomes readable. Otherwise the epoll call blocks indefinitely. Every three seconds a timer file object expires, thus becoming readable.

If the user interrupts the program by keyboard (hitting CTRL+C), it receives SIGINT. This signal is masked and only the signal file object reacts by becoming readable. In this case a one is written to the event file descriptor.

Finally, if the event file descriptor is activated (by the signal file writing to it, see above), the loop is terminated. If the timer is disarmed (settime(0,0)), nothing would happen until the user interferes.