Отвечая по порядку:
MAP_SHARED
. Стоит отметить, что mmap ()работает не только с файлами, вы также можете делать с ним другие вещи, такие как:
Найти это было непросто (, но весело :)).
Краткий ответ
gethostbyname2 (), который использует __поиск _имя (), имеет некоторые жестко закодированные -значения для интерфейса loopback ('lo' ). Когда вы указываете «localhost» в команде «getent hosts», она в конечном итоге использует значение по умолчанию для IPv6, прежде чем попытается использовать IPv4, таким образом, вы получите ::1. Вы можете изменить код getent, чтобы получить 127.0.0.0. 0.1 вот так:
Результат:
$make clean && make &&./getent hosts localhost
rm -f *.o
rm -f getent
gcc -g -Wall -std=gnu99 -w -c getent.c -o getent.o
gcc getent.o -Wall -lm -o getent
127.0.0.1 localhost
Подробнее
Инструмент getent использует функции, определенные и реализованные библиотекой musl . Когда мы запускаем команду
$getent hosts localhost
Инструмент вызывает функцию _ключей ()хостов в getent.c для разрешения предоставленного ключа. Функция пытается решить 4 метода:
Все функции musl реализованы в /src/network/, см. здесь . gethostbyname2()(реализовано в gethostbyname2.c )вызывает gethostbyname2 _r()(реализовано в gethostbyname2 _rc ), которое вызывает __поиск _имя()(в поиске _имя.c ). __поиск _имя (), опять же, как несколько вариантов разрешения имени хоста, первым из которых является имя _из _ноль (в том же файле):
static int name_from_null(struct address buf[static 2], const char *name, int family, int flags)
{
int cnt = 0;
if (name) return 0;
if (flags & AI_PASSIVE) {
if (family != AF_INET6)
buf[cnt++] = (struct address){.family = AF_INET };
if (family != AF_INET)
buf[cnt++] = (struct address){.family = AF_INET6 };
} else {
if (family != AF_INET6)
buf[cnt++] = (struct address){.family = AF_INET,.addr = { 127,0,0,1 } };
if (family != AF_INET)
buf[cnt++] = (struct address){.family = AF_INET6,.addr = { [15] = 1 } };
}
return cnt;
}
В самом конце мы видим, что когда family == AF _INET6, мы получим жестко закодированное -значение ::1. Так как getent пробует IPv6 до IPv4, это будет возвращаемое значение.. Как я показал выше, принудительное разрешение как IPv4 в getent приведет к жестко запрограммированному значению 127.0.0.1 из функции выше.
Если вы хотите изменить функциональность, чтобы возвращать IPv4-адрес для локального хоста, лучше всего сначала отправить/запросить исправление для getent для поиска IPv4.
Надеюсь, это поможет!