Откуда getpwuid выделяет память?Linux

Ответить
Anonymous
 Откуда getpwuid выделяет память?

Сообщение Anonymous »

Я хотел бы понять, откуда функция getpwuid выделяет память. У меня есть пример кода, который печатает имя пользователя для ввода идентификатора пользователя в программу.
Я прочитал страницу руководства по getpwuid и там написано:

Возвращаемое значение может указывать на статическую область и может быть перезаписано
последующими вызовами getpwent(3), getpwnam() или getpwuid(). (Не передавайте
возвращенный указатель на free(3).)

Я читал, что статическая область в структуре памяти процесса содержит текст, инициализированные данные и неинициализированные данные. Но возвращаемый адрес не находится ни в одном из этих регионов (насколько я понимаю - глядя на границу этих регионов из etext, edata и end).
У меня следующие вопросы:
  • Я не могу понять, кто выделяет память для строки имени пользователя (и шести другие поля в структуре passwd). Кто несет ответственность за ее освобождение?
  • Как компилятор может знать, какой длины будут имя пользователя, пароль и другие поля, чтобы он мог распределять память статически?
#include
#include
#include
#include
#include
#include

extern char etext, edata, end;

char* userNameFromId(uid_t uid)
{
struct passwd *pwd;
pwd = getpwuid(uid);
return (pwd==NULL)?NULL:pwd->pw_name;
}

int main(int argc, char** argv)
{
uid_t u;
char* endptr = NULL;
char* name;
if(argc!=2){
printf("Usage: %s [user_id]\n", argv[0]);
return -1;
}
u = strtol(argv[1], &endptr, 10);
if(*endptr!='\0') {
printf("%s is not a number\nUsage: %s [user_id]\n", argv[1], argv[0]);
return -1;
}
name = userNameFromId(u);
if(name == NULL) {
printf("No user was found with the given id: %s\n", argv[1]);
return -1;
}
printf("program text ends before %10p\n", &etext);
printf("initialized data ends before %10p\n", &edata);
printf("uninitializd data ends before %10p\n", &end);
printf("name is located at %10p\n", &name);
printf("program break is located at %10p\n", sbrk(0));
printf("User name for id %d is %s\n", u, name);
return 0;
}

После выполнения этой программы выводится примерно следующее:
ragav@DESKTOP-JJOG9GH:~$ ./a.out 1000
program text ends before 0x559fbcea23d5
initialized data ends before 0x559fbcea5010
uninitializd data ends before 0x559fbcea5018
name is located at 0x7ffc87a9f7f0
program break is located at 0x559fbd81b000
User name for id 1000 is ragav


Подробнее здесь: https://stackoverflow.com/questions/791 ... emory-from
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»