Здесь на самом деле происходит то, что вывод printf
буферизуется и не отправляется на fd 1 немедленно;вместо этого буфер сбрасывается в дескриптор файла 1 во время выполнения C после возврата из main
.Если вы close(newfd)
, вы фактически воспрепятствовали автоматическому сбросу, который в противном случае выполняется во время выполнения при выходе.
Если вы явно fflush(stdout)
перед вами close(newfd)
, ваш вывод должен появиться вfile.
Кстати, если вы хотите перенаправить определенный дескриптор файла, существует альтернативный системный вызов dup2(oldfd, 1)
, который делает fd 1 дубликатом oldfd
, закрывая fd 1, если он был ранее открыт.