https://elixir.bootlin.com/linux/v5.19/source/fs/pipe.c#L247
当管道已满时,不应该唤醒读取器来读取数据吗?
/*
* We only wake up writers if the pipe was full when we started
* reading in order to avoid unnecessary wakeups.
*
* But when we do wake up writers, we do so using a sync wakeup
* (WF_SYNC), because we want them to get going and generate more
* data for us.
*/
was_full = pipe_full(pipe->head, pipe->tail, pipe->max_usage);
答案1
该代码在管道被读取时运行;由于正在读取管道,因此读取完成后管道不会满,因此将有空间进行更多写入。
如果在开始读取之前管道已满,则意味着可能有写入器因管道已满而被阻塞;这些作家现在醒来很有用,可以最大限度地减少等待时间。如果管道未满,则任何被阻止的写入器都不会因为管道已满而被阻止,因此释放管道中的空间不会对它们有帮助,唤醒它们也没有用。
读者们被唤醒了当管道被写入。