Сравните две структуры passwd - PullRequest
2 голосов
/ 04 февраля 2020

У меня есть проблема, которую я сузил настолько, насколько я могу себе представить. Я хочу посчитать строки в /etc/passwd два раза. Один раз в качестве ссылки и один раз, чтобы обнаружить любое изменение.

Я инициализирую одну passwd структуру и подсчитываю количество записей в ней. Я тогда звоню setpwent(). После того, как я это сделал, я инициализирую вторую структуру passwd, обратите внимание, что я добавил вызов sleep, поэтому достаточно добавить еще одного пользователя. Проблема в том, что новая структура идентична первой, хотя я добавил нового пользователя и инициализировал новую структуру после ее добавления. Так что без разницы.

#include <stdio.h>
#include <pwd.h>
#include <unistd.h>
int main()
{
    for(;;)
    {
        struct passwd *i;
        int y = 0;
        while((i = getpwent()) != NULL)
            y++;
        printf("Lines : %d\n", y);
        setpwent();
        sleep(30);
        struct passwd *j;
        int x = 0;
        while((j = getpwent()) != NULL)
            x++;
        printf("Lines : %d\n", x);
        setpwent();
    }
}

1 Ответ

5 голосов
/ 04 февраля 2020

Вы используете getpwent(), который при первом вызове читает файл /etc/passwd и анализирует его внутри, предоставляя вам все записи. После этого, когда вы делаете setpwent(), вы просто сбрасываете внутренний указатель, который отслеживает уже проанализированных записей. Когда вы выполните getpwent() снова после setpwent(), файл /etc/passwd не будет доступен повторно, так как информация уже проанализирована.

Если вы хотите заставить getpwent() повторно каждый раз открывайте и анализируйте /etc/passwd, сначала вам нужно позвонить endpwent(). Замените звонки на setpwent() на endpwent(), и вы будете хороши на go.


С на страницу руководства :

Функция setpwent() перематывает к началу базы паролей.

Функция endpwent() используется для закрытия базы паролей после выполнения всей обработки.

...