Oto co się dzieje gdy proces chce czytać z pustego pipe'a:
void pipe_wait(struct inode * inode)
{
DECLARE_WAITQUEUE(wait, current);
current->state = TASK_INTERRUPTIBLE;
add_wait_queue(PIPE_WAIT(*inode), &wait);
up(PIPE_SEM(*inode));
schedule();
remove_wait_queue(PIPE_WAIT(*inode), &wait);
current->state = TASK_RUNNING;
down(PIPE_SEM(*inode));
}
static ssize_t pipe_read( ... )
{
...
if (PIPE_EMPTY(*inode)) {
...
for (;;) {
pipe_wait(inode);
if (!PIPE_EMPTY(*inode))
break;
}
}
...
}
Powyższe funkcje pochodzą z pliku fs/pipe.c