static atomic_t bytes_available = ATOMIC_INIT(0); #define READ_POSSIBLE (atomic_read(&bytes_available) != 0) ssize_t driver_read(struct file *instance, char __user *buffer, size_t max_bytes_to_read, loff_t *offset) { size_t to_copy, not_copied; char kernelmem[128]; // lokale Variable: Schutz über Spinlocks kann entfallen if (!READ_POSSIBLE && (instance->f_flags & O_NONBLOCK)) { // keine Daten vorhanden und Nonblocking-Mode return -EAGAIN; } if (wait_event_interruptible( wq_read, READ_POSSIBLE)) { // während des Schlafens durch ein Signal unterbrochen return -ERESTARTSYS; } to_copy = min((size_t)atomic_read(&bytes_available), max_bytes_to_read); not_copied = copy_to_user(buffer, kernelmem, to_copy); atomic_sub(to_copy - not_copied, &bytes_available); return to_copy - not_copied; }