Skip to content

fasync and SIGIO

fasync and SIGIO provide asynchronous notification for file descriptors. This mechanism is commonly used by character drivers that want to notify userspace when new data or events are available.

Core Concept

driver event generated
queue event data inside driver
wake_up_interruptible()
kill_fasync()
SIGIO delivered to userspace
userspace reads the device

SIGIO is only a notification. The actual event data should still be read from the device.

Driver-Side APIs

API / Operation Purpose
.fasync file operation Register or unregister async notification
fasync_helper() Maintain the async listener list
kill_fasync() Send SIGIO to registered userspace owners

Userspace Setup

int flags;

fcntl(fd, F_SETOWN, getpid());
flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | O_ASYNC | O_NONBLOCK);

Driver Release Cleanup

A driver should unregister async notification during release:

mydev_fasync(-1, file, 0);

When to Use It

fasync / SIGIO is useful for learning and for some legacy-style async notification designs. For larger event-driven systems, poll() / epoll() is usually easier to integrate and reason about.

Common Pitfalls

Pitfall Result
Doing too much work in a signal handler Unsafe signal handling
Treating SIGIO as data Lost event details or incorrect design
Forgetting release cleanup Stale async registration
Not using a driver-side queue Notification may arrive without retrievable data