если fd равно 3, он закроет fds 0, 1, 2, который изначально указывал бы на stdin, stdout, stderr соответственно, и создаст 3 копии fd: 0, 1, 2, все указывающие на тот же пункт назначения, что иfd 3. теперь вам не нужно 3, поэтому вы закрываете его, потому что у вас уже есть 0, 1, 2, указывающие на то, куда указывал 3, и вы больше не планируете использовать 3.
если fdравен 1, он закроет fds 0, 2, который изначально указывал бы на stdin, stderr соответственно, и создал бы 2 копии fd: 0, 2, все указывающие на тот же пункт назначения, что и fd 1 (stdout).теперь вам нужно 1, указывающее на stdout, потому что остальная часть вашей программы планирует использовать 1 в качестве stdout, поэтому вы не закрываете fd в этом случае.
, поэтому вам нужен оператор if, потому что в одном случае вам нужнозакрыть fd, который вы не планируете использовать, а в другом случае вам не нужно закрывать fd, который вы планируете использовать.
man page: http://linux.die.net/man/2/dup2