Непонятная ошибка сегментации при использовании Boost Coroutine (1.55)?

Я пишу кусок кода, который получит 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 очень большой, поэтому он никогда не получит eof до появления segfault. Я использую 1,55 Boost, и есть некоторые наблюдения:

  1. ошибка сегмента произошла в line I
  2. Если я удаляю или перемещаю f.close() перед предложением yield исчезла ошибка сегмента.
  3. Если я удалю line J в коде ошибка seg исчезла.
  4. Если я использую меньшее число вместо 8192(скажем, 512) ошибка ошибки исчезла.

В чем здесь проблема?

2

Решение

«Слишком много открытых файлов» — вы превышаете максимальное количество дескрипторов открытых файлов

Если я использую меньшее число вместо 8192 (скажем, 512), ошибка сегмента исчезла.

ошибка сегмента произойдет внутри ifstream (не выдает)
проверьте ulimit -n
cat / proc / sys / fs / file-max
Sysctl

1

Другие решения


По вопросам рекламы [email protected]