Как визуализировать EOF в bash

Прочитав (очень быстро )исходный код , я бы сказал, что старая запись удалена:

if (t->entries >= ip_list_tot) {
        e = list_entry(t->lru_list.next, struct recent_entry, lru_list);
        recent_entry_remove(t, e);
}

Чтобы увеличить это значение, вы можете установить параметр при загрузке модуля вручную:

~$ sudo modinfo -p xt_recent
ip_list_tot:number of IPs to remember per list (uint)
ip_list_hash_size:size of hash table used to look up IPs (uint)
ip_list_perms:permissions on /proc/net/xt_recent/* files (uint)
ip_list_uid:default owner of /proc/net/xt_recent/* files (uint)
ip_list_gid:default owning group of /proc/net/xt_recent/* files (uint)
ip_pkt_list_tot:number of packets per IP address to remember (max. 255) (uint)
~$ sudo modprobe xt_recent ip_list_tot=10000
~$ sudo cat /sys/module/xt_recent/parameters/ip_list_tot
10000

Перед выгрузкой/загрузкой убедитесь, что модуль не используется. (отключите брандмауэр или, по крайней мере, правила, использующие recentсоответствие ).

Чтобы сделать этот параметр постоянным, вы можете поместить файл в /etc/modprobe.d/xt _недавний со следующим содержимым:

options xt_recent ip_list_tot=10000

(Обратите внимание, что этот метод может не работать и может быть адаптирован в зависимости от вашего дистрибутива ).

Трудно сказать, какие проблемы с производительностью могут возникнуть при последовательном увеличении значения этого параметра. Это зависит от вашего оборудования, от других задач, запущенных в системе, и т. д.

Тем не менее, основываясь на чтении исходного кода и моем собственном опыте разработки, я бы сказал, что главное, чего вы можете бояться, — это введение задержки, если, например, в настоящее время тестируемый IP-адрес является последним в списке. или нет в списке (, что может часто встречаться):

static struct recent_table *recent_table_lookup(struct recent_net *recent_net,
                        const char *name)
{
    struct recent_table *t;

    list_for_each_entry(t, &recent_net->tables, list)
        if (!strcmp(t->name, name))
            return t;
    return NULL;
}

Учитывая xсложность list_for_each_entry() + strcmp,дополнительная «стоимость» установки `ip _list _tot̀ на огромное значение — это время просмотра списка.

Окончательная сложность может варьироваться от 1 * xдо ip_list_tot * x.

Тем не менее, я предполагаю, что связанный список в ядре хорошо реализован, производительность и скорость являются требованиями.

В заключение я бы посоветовал вам провести сравнительный анализ... если это возможно.

3
21.09.2021, 17:07
1 ответ

Из /dev/nullвы получаете только то, что системный вызов read()успешно возвращается с нулевым прочитанным байтом. Это то же самое, что происходит при попытке read()из (или после )конца файла, и из-за этого это называется «конец -из -файла».

Но есть и более странные случаи, например, терминал, который может возвращать нулевые байты при одном вызове (, если пользователь нажимает ^Dна пустой строке или после другого ^D), но затем возвращает больше данных. при следующем прочтении. И сокеты дейтаграмм, которые могут поддерживать дейтаграммы с нулевым -байтом, и система будет возвращать нулевые байты для такой дейтаграммы, но все равно будет возвращать следующую дейтаграмму при следующем вызове. Также, конечно, вы можете read()из файла в конце получить нулевые байты, но затем повторить вызов позже, и на этот раз вы обнаружите, что ожидаются дополнительные данные. (Вот что могла бы сделать реализация tail -f.)

Вы не можете на самом деле "печатать EOF", так как нечего печатать. Это просто отсутствие данных.

Зная, что catвыходит из EOF, вы, конечно, могли бы сделать что-то вроде

(cat /dev/null; echo EOF) | whatever...

печатать что-то после конца.Не то, чтобы это было очень полезно, ИМО.

См.:

5
21.09.2021, 21:11

Теги

Похожие вопросы