2014-08-28 2 views
0

У меня есть задание, в котором я должен симулировать команду ls -l unix с помощью C. Я выяснил все, кроме поиска владельца и группы определенного файла. У меня есть uid и gid из структуры stat, используя системный вызов stat(), но я не могу сопоставить их с фактическим именем пользователя и владельца соответственно. Я должен использовать только те системные вызовы, которые перечислены в man 2 страницах. Я попытался найти ответ, но везде он говорит использовать вызов getpwnam(), который я не могу, поскольку он не указан в man 2 страницах.Как найти владельца и имя группы из uid и gid с помощью системных вызовов, перечисленных в man 2 страницы?

+0

'getpguid (uid_t uid)' и 'getgrgid (gid_t gid)' (они находятся на той же странице man, что и те, которые основаны на имени). Оба возвращают ponter в (статическую) структуру. – wildplasser

ответ

2

Да, getpwnam (3) и getgrnam (3) являются способами вы бы сделать это в настройках не ограничивается только системных вызовов.

Но даже чтение содержимого /etc/passwd с использованием только системных вызовов представляет собой вызов или два. Обычные друзья, как FOPEN (3), Fread (3) и fgets (3) не доступны, и не являются струнные хелперы как strsep (3). Я думаю, вы застряли в читаете (2). Вы можете прочитать один символ за раз, используя , прочитайте (2) и выполните грубый разбор содержимого таким образом.

Или вы можете настроить массив символов, который достаточно велик, чтобы читать все /etc/passwd в память и просматривать содержимое файла таким образом. У вас будет информация stat (2) вернулась, чтобы сообщить, насколько велика /etc/passwd, так что это может быть неудачно, если оно слишком велико для ваших предположений или реализовать стратегию буферизации самостоятельно.

Или вы можете посмотреть в sbrk (2), и убедитесь, что у Вас есть достаточно памяти, чтобы посадить все /etc/passwd в памяти от одного чтения (2).

Однако вы читаете содержимое, у вас будет некоторое преобразование текста - строки цифр - в C числовые типы, сложнее, если atoi (3) недоступен.

Также весело: преобразование time_t (время (2) выход, и некоторые из полей struct stat) до хорошей строки:

1409264099 -> Thu Aug 28 17:14:59 2014

Являются ли эти действительно правила задания .. .? C является достаточно сырым без присутствия обычного libc ...

0

Вы можете найти файл /etc/passwd за то, что вам нужно. Вы можете узнать структуру файла /etc/passwd с помощью man 5 passwd. Нет системного вызова, который сделает это за вас.

0

Только системные вызовы ... о, дорогая!

Ну, я бы mmap /etc/passwd и /etc/group и поиск областей памяти с использованием основных операций С. Оба файла ориентированы по прямой, поэтому строки разделяются \n, и в каждой строке записи разделяются двоеточиями.

Смежные вопросы