Необходимо реализовать функциональность для добавления/удаления пользователей и групп в системе Linux. Я использую этот POSIX вызовов:Группа Linux и управление пользователями
- недействительного setgrent (аннулируется) - для открытия группы файлов
- структуры группы * getgrent (Недействительные); - для чтения групповой структуры
- недействительным endgrent (аннулируются) - для закрытия файла
Идея заключается в том, чтобы прочитать все пользовательские и групповые структуры в векторе, изменять их, а затем переписать существующие/и т.д./пароль и/etc/групповые файлы. Описание функции Getgrent() говорит, что эти функции имеют статические переменные с выделенной памятью, и этот указатель не должен быть освобожден вручную. Это означает, что endgrent() должен освобождать все указатели на кучу. Это вызывает проблему, потому что группа структур содержит много данных о куче. Поэтому, если я решил сохранить его где-то, мне нужно сделать strdup() для каждого члена в gr_mem, а также для других членов, поэтому я не теряю никаких данных.
Есть ли способ более эффективно хранить групповые структуры? Может быть, есть еще один способ решить эту проблему?
struct group
{
char *gr_name; // The name of the group.
gid_t gr_gid; // The group ID of the group.
char **gr_mem; // array of group members
}
Нет, но зачем делать несколько 'strdup' беспокоить вас? У вас не будет таких пользователей (системы с тысячами пользователей редки, и это легко подходит для всех настольных компьютеров ....) –
Все эти вызовы - POSIX. – Duck
@BasileStarynkevitch На самом деле я разрабатываю встроенную систему. Вот почему я пытаюсь минимизировать операции чтения/записи, а также получать максимальную производительность. Я в порядке с этим решением, просто надеясь на критику со стороны сообщества. – incogn1to