context
Я медленно пишу специализированное приложение веб-сервера на C ++ (используя библиотеку C onion http * и библиотеку JSONCPP для сериализации JSON,если это имеет значение). для системы Linux с компилятором GCC 4.6 (меня не волнует переносимость в системы, отличные от Linux, или в GCC до 4.5 или в Clang до 3.0).
Я решил оставитьпользовательская «база данных» (пользователей будет очень мало, возможно, один или два, поэтому производительность не имеет значения, а время доступа O (n) приемлемо) в формате JSON, вероятно, в виде небольшого массива объектов JSON, таких как
{ "_user" : "basile" ;
"_crypasswd" : "XYZABC123" ;
"_email" : "basile@starynkevitch.net" ;
"firstname" : "Basile" ;
"lastname" : "Starynkevitch" ;
"privileges" : "all" ;
}
с соглашением (а-ля .htpasswd
), что поле _crypasswd
является crypt (3) «шифрованием» пароля пользователя, с добавлением имени _user
;
Причина, по которой я хочу описывать пользователей объектами Json, заключается в том, что мое приложение может добавлять (а не заменять) некоторые поля JSON (например, privileges
выше) в такие объекты Json, описывающие пользователей.Я использую JsonCpp в качестве библиотеки синтаксического анализа Json для C ++.Эта библиотека хочет, чтобы ifstream
был проанализирован.
Итак, я читаю мой файл паролей с
extern char* iaca_passwd_path; // the path of the password file
std::ifstream jsinpass(iaca_passwd_path);
Json::Value jpassarr;
Json::Reader reader;
reader.parse(jsinpass,jpassarr,true);
jsinpass.close();
assert (jpassarr.isArray());
for (int ix=0; ix<nbu; ix++) {
const Json::Value&jcuruser= jpassarr[ix];
assert(jcuruser.isObject());
if (jcuruser["_user"].compare(user) == 0) {
std::string crypasswd = jcuruser["_crypasswd"].asString();
if (crypasswd.compare(crypted_password(user,password)) == 0) {
// good user
}
}
}
question
Очевидно, я хочу flock
или lockf
файл пароля, чтобы гарантировать, что только один процесс читает или записывает его.Чтобы вызвать эти функции, мне нужно получить дескриптор файла (на языке Unix) ifstream jsinpass
.Но Google дает мне в основном файл Крекеля (который я считаю полным, но немного безумным), чтобы получить файловый дескриптор std::ifstream
, и я не уверен, что конструктор не будет предварительно читать некоторые изЭто.Отсюда мой вопрос :
как мне заблокировать C ++ ifstream
(Linux, GCC 4.6)?
(или вы нашли какой-то другой способ решения этой проблемы??)
Спасибо