>>536,541
ちょっと違う。
・まずファイルディスクリプタはプロセスごとに空間が分かれている
・自プロセスの空間で任意の番号に再配置することはdup2システムコールで可能
・プログラム起動時(execve)には通常ファイルディスクリプタは引き継がれる

だから「起動前に3番のfdを開いておく必要がある」ようなプログラムなら一応実現可能

>>542 の例ではこういうことが起きている
・外側のシェルがpipeシステムコールで書き込み側と読み出し側のfdのペアを作成
・forkして子プロセスで書き込み側のfdをdup2で3に配置、読み出し側は閉じる
・子プロセスでexecveしてshを起動、shがfd=3へ書き込み
・外側のシェルが読み出し側のfdから読み出してfd=1へ書き込み