Причина того, что сокеты TCP / IP используют файловые дескрипторы , заключается в том, что, когда интерфейс сокетов был впервые разработан и реализован ( в BSD Unix в 1983 году ), его разработчики считали, что сетевое соединение было аналогично файлу - вы можете прочитать
, записать
и закрыть
оба, и что это хорошо согласуется с идеей Unix "все это файл ".
Другие реализации сетевого стека TCP / IP не обязательно интегрировались с подсистемой файлового ввода-вывода их ОС, например MacTCP . Но поскольку интерфейс сокетов BSD был настолько популярен, даже эти другие реализации решили реплицировать API сокетов с его Unix-подобными функциями, так что вы получили «файловые дескрипторы», используемые только для связи TCP / IP, в системах, которые иначе не работали. имеют файловые дескрипторы.
Другая часть вашего вопроса: Почему существует ограничение? Это потому, что самый быстрый способ реализовать таблицу поиска файловых дескрипторов - использовать массив. Исторически ограничение было жестко запрограммировано в ядре.
Вот код в Unix версии 7 (1979) с жестко заданным ограничением в 20 файловых дескрипторов на процесс:
Для сравнения, Linux динамически выделяет пространство для таблицы файловых дескрипторов процесса. Абсолютный предел по умолчанию равен 8192, но вы можете установить его как угодно. Моя система перечисляет 191072 в / proc / sys / fs / file-max
.
alloc_fdtable ()
struct fdtable
#define NR_FILE 8192
Несмотря на то, что в Linux больше нет абсолютных ограничений, мы, тем не менее, не хотим позволять программам сходить с ума, поэтому администратор (или упаковщик дистрибутива) обычно устанавливает ограничения ресурсов. Взгляните на /etc/security/limits.conf
или запустите ulimit -n
.
После безуспешной работы с iptables
я выбрал совершенно другой подход:
Все DNS-запросы для сервера спама / фишинга / рекламы на имена отвечают 0.0.0.0, например. браузер определяет как не маршрутизируемый и быстро дает сбой.
Ваше первое предложение должно работать правильно. Я полагаю, что единственным вариантом является проверка того, что вы вводите переменные правильно (космос разделен, а не запятая). Можно продемонстрировать правильность кода, слегка изменив его, чтобы напечатать значения двух переменных и напечатать команду matlab
, а не выполнить ее:
#!/bin/bash
echo "Please variables 1 and 2:"
read var1 var2
echo "var1=$var1, var2=$var2."
echo matlab -nodesktop -nosplash -r "functionmat($var1,$var2)"
-121--160888- Для этого существует команда Видимо, нельзя. matlab
.
BTW, будьте очень осторожны с system ()
, если вы заботитесь о безопасности.
Похоже, что у вас есть DROP
в качестве действия iptables
по умолчанию в цепочке INPUT
. Измените значение на REJECT
и произойдет быстрый сбой.