Я медленно пишу специализированное приложение веб-сервера на C ++ (с использованием библиотеки onion http-сервера C и библиотеки 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 (например, привилегии
] выше) в таких объектах 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
Очевидно, я хочу скопировать
или lockf
файл паролей, чтобы гарантировать, что только один процесс читает или написав это.Чтобы вызвать эти функции, мне нужно получить дескриптор файла (на языке Unix) ifstream jsinpass
. Но Google дает мне в основном fileno Крекеля (который я считаю полным, но немного безумным), чтобы получить файловый дескриптор std :: ifstream
, и я не уверен, что конструктор выиграл Не читаю заранее некоторые из них. Отсюда мой вопрос :
ifstream
(Linux, GCC 4.6)? (Или вы найдете другой способ решить эту проблему?)
Спасибо