2

C++ アプリケーションでライブラリを使用していて、すべての出力をファイルにキャプチャしようとしています。stderr を stdout にリダイレクトしてから、次のように stdout をファイルにリダイレクトしようとしました。

./a.out 2>&1 > out.txt

これにより、アプリケーションのほぼすべてがキャプチャされますが、使用しているライブラリに関連する出力がコンソールにまだ残っています。私の質問は:

  • stdout/stderr 以外に何かありますか? (標準入力以外)
  • ある場合、私の場合、これらをどのように特定できますか?
  • そして、どうすればこれらを同じファイルにリダイレクトできますか?

注:誰かがよく知っている場合、ライブラリはSystemCと呼ばれます(これは、主にシステム/ハードウェア設計のための C++ 上のイベント駆動シミュレーション ライブラリ/言語です)。

4

2 に答える 2

2

うーん、プログラムが制御端末に出力している可能性があると思います。1 つの可能性として、プログラムを制御端末のないデーモンとして実行することが考えられます。コードをデーモンに変換するために呼び出す関数があります。これは、強くお勧めするThe Linux Programming InterfaceCという本から入手しました。

#define BD_NO_CHDIR 01 /* Don't chdir("/") */
#define BD_NO_CLOSE_FILES 02 /* Don't close all open files */
#define BD_NO_REOPEN_STD_FDS 04 /* Don't reopen stdin, stdout, and
               stderr to /dev/null */
#define BD_NO_UMASK0 010 /* Don't do a umask(0) */
#define BD_MAX_CLOSE 8192 /* Maximum file descriptors to close if
             sysconf(_SC_OPEN_MAX) is indeterminate */


int becomeDaemon(int flags){

  int maxfd, fd, new_stdout;
  switch (fork()) { /* Become background process */
  case -1: return -1;
  case 0: break; /* Child falls through... */
  default: _exit(EXIT_SUCCESS); /* while parent terminates */
  }
  if (setsid() == -1) /* Become leader of new session */
   return -1;
  switch (fork()) { /* Ensure we are not session leader */
  case -1: return -1;
  case 0: break;
  default: _exit(EXIT_SUCCESS);
  }

  if (!(flags & BD_NO_UMASK0))
    umask(0); /* Clear file mode creation mask */
 if (!(flags & BD_NO_CHDIR))
   chdir("/"); /* Change to root directory */
 if (!(flags & BD_NO_CLOSE_FILES)) { /* Close all open files */
   maxfd = sysconf(_SC_OPEN_MAX);
   if (maxfd == -1) /* Limit is indeterminate... */
     maxfd = BD_MAX_CLOSE; /* so take a guess */
   for (fd = 0; fd < maxfd; fd++)
     close(fd);
 }


 if (!(flags & BD_NO_REOPEN_STD_FDS)) {

   /*
     STDIN = 0
     STDOUT = 1
     STDERR = 2
   */

   close(0); /* Reopen standard fd's to /dev/null */
   fd = open("/dev/null", O_RDWR);
   if (fd != 0) /* 'fd' should be 0 */
     return -1;
   if (dup2(0, 1) != 1)
     return -1;
   if (dup2(0, 2) != 2)
     return -1;
  }



 return 0;
}

open("/dev/null", O_RDWR)ここで、行を変更してopen("/home/you/output.txt", O_RDWR)そこに出力をリダイレクトできると思います。もちろん、端末からプログラムに直接入力することはできませんが、エラーメッセージの音から、とにかくソケットを使用していると思うので、クライアントを作成してそれを行うことができます必要だった場合。

それが役立つことを願っています。

于 2013-04-22T16:06:55.420 に答える