2

を取得するコードを書きますSegmentation fault。Boost Coroutine のバグなのか、以下のコードのバグなのかはわかりません。

#include <string>
#include <functional>
#include <vector>
#include <fstream>
#include <boost/coroutine/coroutine.hpp>
using namespace std;

template <class T>
using C = boost::coroutines::coroutine<T()>;

string foo(C<string>::caller_type & yield,
           std::string fn, int cnt) {
  std::ifstream f(fn);
  // f.close();
  int local_cnt = 0;
  while(local_cnt < cnt) {
      string l;
      getline(f, l);
      local_cnt ++;
      yield(l);
  }
  f.close();
}

int main(int argc, char *argv[])
{
  vector<C<string> > result;
  for(int i = 0; i < 8192; ++i) {
    C<string> obj(bind(foo, std::placeholders::_1, "test.txt", 3)); // line I
    result.push_back(std::move(obj)); // line J
  }
  return 0;
}

test.txt非常に大きいため、segfault が発生する前に eof を取得することはありません。私は 1.55 の Boost を使用していますが、いくつかの観察結果があります。

  1. でセグエラーが発生しましたline I
  2. f.close()yield 句の前に削除または移動すると、seg-error が消えました。
  3. line Jコード内で削除すると、seg-error が消えました。
  4. (たとえば 512)の代わりに小さい数値を使用する8192と、seg-error は消えました。

ここで何が問題なのですか?

4

1 に答える 1

1

「開いているファイルが多すぎます」 - 開いているファイル記述子の最大数を超えています

8192 (たとえば 512) の代わりに小さい数値を使用すると、seg-error はなくなりました。

seg fault は ifstream 内で発生します (スローしません) check ulimit -n cat /proc/sys/fs/file-max sysctl

于 2015-01-19T07:18:34.977 に答える