fork 関連でこれは難しいなと思ったのは、「プロセスのリソースは全て複製されるが、 pipe() で生成されたパイプそのものは複製されない」という辺りで引っ掛かっている人が多かったのを見たときです
主に「pipe はなんで共有されるのか」と「file descriptor は整数なんだけど結局何やねん」あたりの疑問はね、たしかにまあメンタルモデルしっかり作らないと納得いかないだろうなと
私が説明するときは「file descriptor は入出力先を利用する権利、チケットであって、 fork() で複製されるのはプロセスが所有するチケットであって pipe そのものではない」みたいな説明をしている (納得してもらえているかはわからんが)