printf будет печатать в дескриптор файла 1, вы можете закрыть его и открыть файл, это даст вам еще один fd, возможно, 1, потому что это самый низкий из доступных fd, если вы не были достаточно быстры
Если вы просто close(1);
, а затем int fd = open(file);
fd должно быть 1, если никто не открыл что-то между закрытием и открытием. В этот момент любой, кто выводит на fd номер 1, напечатает ваш файл.
Это потому, что система должна дать вам lowest available file descriptor number
, поэтому она даст вам 1, именно то, что пишет printf.
Как уже упоминалось @roe, вы можете предпочесть сделать dup () более 1, чтобы получить еще один номер fd, который можно распечатать на стандартный вывод.