3

Linux でオープン システム コールをインターセプトしようとしています。他のライブラリでは問題なく動作しますが、boost libboost_fileystem では機能しません。これが私のコードです(読みやすくするために削除されています)。

#include <boost/filesystem/fstream.hpp>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <dlfcn.h>
#include <stdarg.h>
#include <stdio.h>

using namespace std;
using namespace boost::filesystem;

typedef int (*open_func_type)(const char * pathname, int flags, ...);

int open(const char *path, int flags, ...)
{
  va_list arg;
  mode_t mode = 0;
  if (flags & O_CREAT)
    {
      va_start(arg, flags);
      mode = va_arg(arg, mode_t);
      va_end(arg);
    }

  //some stuff here
  open_func_type open_func = (open_func_type) dlsym(RTLD_NEXT, "open");
  return open_func(path, flags, mode);
}

int main()
{
   boost::filesystem::fstream build_path;
   build_path.open("/tmp/test.txt", ios::in);

   //other stuff
   return 0;
}

gdb を使用してコードをステップ実行しましたが、開いている実装が呼び出されません。しかし、strace を実行すると、open システム コールが呼び出されていることがわかります。open を呼び出す他のライブラリ関数を呼び出すと、実装が呼び出されていることがわかります。私がここで間違っていることはありますか?ブースト ライブラリと動的にリンクしています。

4

1 に答える 1

0

私はそれを理解するためにしばらく時間を与え、boost が内部的に std::basic_filebuf open を呼び出し、それが fopen を呼び出すことを発見しました。fopen は、open ライブラリ呼び出しを呼び出さずに、カーネル内で open システム呼び出しを呼び出しているようです (誰かがその理由を指摘できれば幸いです)。fopen 呼び出しをインターセプトしたところ、これで問題なく動作するようになりました。大きなファイルのサポートを使用する場合は、fopen64 も実装する必要があります。

于 2012-10-11T04:42:24.387 に答える