freopen

freopenは、指定のストリームをいったん閉じて、新しいストリームを開いて、指定のファイルと紐づける。

C言語関数辞典 - freopen
freopen, freopen_s - cppreference.com
コンピューター:C言語講座:freopenについて
ファイル処理 | C++ プログラミング解説

/* ヘッダファイルのインクルード */
#include <stdio.h> /* 標準入出力 */

/* main関数 */
int main(void){

  /* 変数の宣言 */
  FILE *fp; /* ファイルポインタfp */

  /* 存在しないファイルをわざと開く. */
  fp = fopen("test.txt", "r"); /* fopenで"test.txt"を開く. */
  if (fp == NULL){ /* NULLなら. */

    /* エラーメッセージの出力. */
    perror("fopen error!"); /* perrorで"fopen error!"と出力. */

    /* 異常終了 */
    return -1; /* -1を返して異常終了. */

  }

  /* プログラムの終了 */
  return 0; /* 0を返して正常終了. */

}

perrorは、stderrに出力しているので、

$ vi freopen.c
$ gcc freopen.c -o freopen
$ ./freopen
fopen error!: No such file or directory
$

このようにコンソール出力される。
これをerr.logにリダイレクトするには、

freopenでstderrをいったん閉じて、新たに開いてerr.logと紐づける。

$ vi freopen.c
$ gcc freopen.c -o freopen
$ ./freopen
$ ls
err.log  freopen  freopen.c
$ cat err.log
new = 658584000, stderr = 658584000
fopen error!: No such file or directory
$

err.logにリダイレクトできた。
ちなみに、戻り値と指定したstderrは同じようだが、stderrだけど2じゃないのか・・・。

Sample/c/freopen/freopen/src/freopen at master · bg1bgst333/Sample · GitHub