DD Висит и бесперебойное сон (ядр quirk?)

Идиома >(...) просто означает (в терминах непрофессионала): "имя файла".

И это работает как "имя файла" (вроде как, все станет ясно через мгновение):

$ echo <(date)
/proc/self/fd/11

Или какое-то другое число/имя в вашей ОС. Но echo действительно выводит имя, точно так же, как если бы вы сделали:

$ echo ProcSubs11
ProcSubs11

И если файл с меткой ProcSubs11 существует, вы могли бы также сделать:

$ cat ProcSubs11
contents_of_file_ProcSubs11

Что вы могли бы сделать точно так же с:

$ cat <(date)
Fri Jan 15 21:25:18 UTC 2016

Разница в том, что фактическое имя "Process Substitution" "не видно" и что детали намного длиннее, чем чтение простого файла, как описано довольно хорошо во всех болезненных подробностях в ссылке на Как подмена процессов реализована в bash?.


Сказав все вышесказанное, давайте рассмотрим ваши вопросы.

Вопрос 1

... кажется, что с операционной точки зрения он ничем не отличается от простой безымянной трубы...

Ну, "Подмена процессов" как раз и основана на неименованной трубе, как сказано в вашей первой ссылке:

  1. Процесс bash создает неименованную трубу для связи между двумя процессами, созданными позже.

Разница в том, что все ~6 шагов, описанных в ссылке, упрощены до одной идиомы >(...) для записи в и для чтения из.

И можно утверждать, что у соединения (трубы) есть имя, как и у файла. Просто это имя скрыто от пользователя (/proc/self/fd/11, показанное в начале).

Пример 1

1) Я добавляю трубу и перенаправление вывода shasum ...

$ cat file_{1,2,3} | tee file_4 | shasum -a 256 > file_4.sha256

Там нет "подстановки процесса", но стоит отметить (для дальнейшего), что tee посылает (пишет) то, что получает в свой stdin в файл file_4 и также посылает то же самое stdin содержимое в stdout. Который, как оказалось, подключен к трубе (в данном случае), которая пишет в shasum.

Короче говоря, говоря простым языком, tee копирует stdin в file_4 и shasum.

Пример 2

2) Я пробую то же самое с ProcSub:

$ cat file_{1,2,3} | tee file_4 >(shasum -a 256 > file_4.sha256)

Повторное использование описания выше (в простых терминах) для описания этого примера:

Tee копирует stdin в три элемента: file_4, shasum и stdout.

Почему? Помните, что >(...) - это имя файла, подставим его в строку:

$ cat file_{1,2,3} | tee file_4 /proc/self/fd/11

tee служит входом для двух файлов file_4 и shasum (через "Process Substitution"), а stdout из tee по-прежнему подключен к своему месту по умолчанию: консоли. Вот почему вы видите цифры в консоли.

Чтобы сделать этот пример точно равным 1), мы могли бы сделать:

$ cat file_{1,2,3} | tee file_4 > /proc/self/fd/11  ### note the added `>`

Что становится (да, пробел между > и >( должен быть использован.

$ cat file_{1,2,3} | tee file_4 > >(shasum -a 256 > file_4.sha256)

Что перенаправляет stdout tee в "Подстановку процесса".

Q 3

Q: Итак, общий вопрос: как обрабатываются i/o для трех случаев, описанных выше

Я полагаю, что только что объяснил три случая, если не ясно, пожалуйста, прокомментируйте.

Вопрос 4 (в комментариях, пожалуйста, отредактируйте и добавьте вопрос)

почему конструкция

Потому что (говоря простым языком) вы не можете вставить мужской штырь в мужское гнездо.

Конструкция stdin внешней команды. Внешняя команда tee пытается подключить stdout (как) элементы. Поэтому эта пара не может совпасть.

Важное замечание: Команда cat скрывает некоторые детали при применении к "Process Substitution", так как обе эти команды дадут одинаковый вывод:

$ cat   <(date)
$ cat < <(date)

Все правильно, но делать выводы из вводящего в заблуждение равенства - неправильно.

1
10.09.2018, 23:01
1 ответ

Если вы не можете прервать «непрерывное чтение» и это не связано с выключенным сервером NFS, вы обнаружили ошибку драйвера.

Время ожидания ввода-вывода в локальное фоновое хранилище не должно превышать 5 -10 минут. Поэтому, если вы набираете ^Cили ^Zи ничего не происходит в течение 10 минут, это ошибка драйвера.

Предыстория заключается в том, что UNIX определяет, что так называемый fast IOне может быть прерван сигналами, поскольку быстрый ввод-вывод завершится через обозримое время.

Прерывание операций ввода-вывода по сигналам приводит к большим накладным расходам, поскольку необходимо вернуться в чистое состояние. Все, что произошло после старта в ИО, нужно раскрутить и возврат может произойти только оттуда, откуда был инициирован ИО.

Хуже того, если драйвер фонового хранилища реализует прерываемый ввод-вывод, это вызовет неустранимые проблемы в файловых системах выше такого драйвера. Вы используете драйвер, предназначенный для использования в качестве фонового хранилища для файловой системы...

Вы можете позвонить dmesgи проверить сообщения ядра о вашей проблеме. Если прерывание действительно не работает через 10 минут (, когда ожидается, что один системный вызов чтения или записи истечет по тайм-ауту, и есть шанс убить ddмежду двумя такими системными вызовами ), вам необходимо перезагрузиться.

Если это устройство подключено к USB, вы можете попытаться извлечь устройство перед перезагрузкой.

1
27.01.2020, 23:42

Теги

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