объединение потока ifstream на C ++ в Linux (GCC 4.6)

context

Я медленно пишу специализированное приложение веб-сервера на 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 , и я не уверен, что конструктор выиграл Не читаю заранее некоторые из них. Отсюда мой вопрос :

как я могу заблокировать C ++ ifstream (Linux, GCC 4.6)?

(Или вы найдете другой способ решить эту проблему?)

Спасибо

5
задан Basile Starynkevitch 29 December 2011 в 12:06
поделиться