Изменить размер буфера именованного канала

Это ожидается, убедитесь, что вы понимаете параметр -t ( man sort : разделитель полей). Команда, которую вы хотели использовать, работает только с обычными IP-адресами.

Быстрым и грязным решением может быть преобразование пробелов в точки . сначала файл, а затем отсортируйте его (возможно, вы захотите отменить преобразование позже, за исключением IP-адресов).

sed -i.bak 's/ /./g' data.log
sort -n -t . -k2,2 -k3,3 -k4,4 -k5,5 data.log

Обратите внимание, что я сдвинул индексы. Попробуйте.

6
22.04.2018, 02:08
1 ответ

Файл fifo— это просто тип файла, который при открытии как для чтения, так и для записи создает экземпляр канала, как это сделал бы системный вызов ()канала.

По крайней мере, в Linux данные, проходящие через этот канал, вообще не сохраняются в файловой системе (только в ядре в виде памяти ядра ). А атрибут size файла fifo не имеет значения и всегда равен 0.

В Linux вы можете изменить размер буфера канала (, независимо от того, был ли этот канал создан с помощью pipe()или путем открытия файла FIFO )с помощью F_SETPIPE_SZfcntl(), хотя для непривилегированных пользователей это связано по /proc/sys/fs/pipe-max-size. Любой писатель или читатель канала может выдать это fcntl(), хотя писателю имеет больше смысла делать это. В случае именованного канала вам нужно будет сделать это для каждого канала, созданного через файл fifo.

$ mkfifo fifo
$ exec 3<> fifo # instantiate the pipe
$ seq 20000 > fifo
^C  # seq hangs because it's trying to write more than 64KiB
$ exec 3<&- 3<> fifo # close the first pipe and instantiate a new one
$ (perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576)'; seq 20000) > fifo
$ # went through this time

Выше я использовал perlдля выдачи fcntl(), жестко закодировав значениеF_SETPIPE_SZ(1031 в моей системе ).

12
27.01.2020, 20:27

Теги

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