Определите, опережает ли производитель потребителя в конвейере

Я должен поставить новый ответ, даже если мой комментарий завершает ответ только на thiagowfx , потому что в комментариях нельзя делать отступы для кода.

Содержимое vim.desktop может быть примерно таким:

[Desktop Entry]
Name=Vim Text Editor
Comment=Edit text files
Exec=vim 
Terminal=true
Type=Application
Icon=terminal
Categories=Utility;TextEditor;
StartupNotify=true
MimeType=text/plain;

Я предпочитаю помещать его в папку ~ / .local / share / applications .

4
27.04.2018, 04:40
1 ответ

Вы можете использовать ioctl(,FIONREAD,)для каналов в Linux, чтобы получить текущее количество байтов, доступных для чтения. Это можно найти в man 7 pipe(FIONREAD, а также в man tty_ioctl). Вы можете либо интегрировать это в свое приложение, либо запустить параллельно с ним что-то вроде этого фрагмента Perl, используя канал как стандартный ввод:

#!/usr/bin/perl
# https://unix.stackexchange.com/a/440361/119298
use strict;
require 'sys/ioctl.ph';
my $v = pack("l",0);
$| = 1;
# while(1)
{
  die "ioctl: $!" if ioctl(STDIN, &FIONREAD, $v)!=0;
  my @r = unpack("l",$v);
  printf "%d ",$r[0];
#  sleep 1;
}

Таким образом, использование будет

node foo.js | (myperl & node bar.js)

Попробуйте что-нибудь вроде

while sleep 1;do date;done |
while sleep 1.1;do myperl 2>/dev/null; dd status=none count=1 bs=20;done

Я получаю предупреждения от perlо _FORTIFY_SOURCE, отсюда и перенаправление stderr. ddчитается меньше, чем длина date, поэтому вы можете видеть, что результат постепенно увеличивается.

Для полнотывы можете получить пропускную способность канала с помощью fcntl(,F_GETPIPE_SZ)и установить его с помощью fcntl(,F_SETPIPE_SZ,newvalue)до /proc/sys/fs/pipe-max-size(, если нет root илиCAP_SYS_RESOURCE). См. man fcntl.

2
27.01.2020, 20:59

Теги

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