Вот решение с помощью a for
цикл и арифметика удара:
i=1
for file in ??-??-??.png ; do
mv "$file" $i.png
let i++
done
Именованные каналы (первым прибыл, первым обслужен) имеют четыре три преимущества, о которых я могу думать:
они двунаправлены, каналы без имени могут быть однонаправлены *
*), Думают о стандартной оболочке
|
конвейер, который однонаправлен, несколько оболочек (ksh
,zsh
, иbash
) также предложение совместно обрабатывает, которые позволяют двунаправленную связь. Каналы обработок POSIX как полудуплексные (т.е. каждая сторона может только читать или записать),pipe()
системный вызов возвращает два дескрипторов файлов, и можно быть обязаны рассматривать тот как только для чтения и другой как только для записи. Некоторые системы (BSD) поддерживают чтение и запись одновременно (не запрещенный POSIX), на других Вам были бы нужны два канала, один для каждого направления. Проверьте Вашpipe()
,popen()
и возможноpopen2()
страницы справочника. Ненаправленность не может зависеть от того, называют ли канал или нет, хотя на Linux 2.6 это зависит.
(Обновленный, благодаря обратной связи от Stephane Chazelas)
Таким образом, одной сразу очевидной задачей, которой Вы не можете достигнуть с каналом без имени, является стандартное клиент-серверное приложение.
Последний (пораженный) момент выше об однонаправленных каналах является важным на Linux, POSIX (см. popen()
) говорит, что канал должен только быть читаемым или записываемым, на Linux они однонаправлены. Посмотрите Понимание Ядра Linux (3-й Ed. O'Reilly) для определенных для Linux деталей (p787). Предложение другой ОС двунаправленные каналы (без имени).
Как пример, Nagios использует FIFO для своего командного файла. Различные внешние процессы (сценарии CGI, внешние проверки, NRPE и т.д.) команды/обновления записи к этому FIFO и они обрабатываются персистентным процессом Nagios.
Именованные каналы имеют функции, мало чем отличающиеся от соединений TCP, но существуют важные различия. Поскольку FIFO имеет персистентное имя файловой системы, которое можно написать к нему, даже когда нет никакого читателя, по общему признанию записи заблокируются (без асинхронного или не блокирующегося ввода-вывода), хотя Вы не освободите данные, если получатель не будет запущен (или перезапускается).
Для ссылки см. также сокеты домена Unix и ответ на этот вопрос о Stackoverflow, который суммирует основные методы IPC и этого, который говорит о popen()
Или неименованные каналы без имени обеспечивают средство непосредственного, одностороннего межпроцессного сообщения между различными процессами, которые связаны или отношениями отцов и детей, или будучи детьми общего родителя, который обеспечивает канал, такой как процесс оболочки. Поскольку процессы связаны, ассоциация дескрипторов файлов к каналу может быть неявной и не требует объекта с именем, которое является внешним к процессам. Канал без имени существует только пока процессы, которые используют его, поддерживают открытые дескрипторы файлов к каналу. Когда выход процессов и ОС закрывают все дескрипторы файлов, связанные с процессами, канал без имени закрывается.
Именованные каналы являются на самом деле FIFO. Это постоянные объекты, представленные узлами в файловой системе. Именованный канал обеспечивает many-many, двухстороннюю связь между одним или несколькими процессами, которые не обязательно связаны и не должны существовать одновременно. Имя файла канала служит адресом или контрактом между процессами для коммуникации. Если только один процесс пишет в именованный канал и еще одно чтения процесса от именованного канала, то именованный канал ведет себя таким же образом как канал без имени между двумя связанными процессами.
Таким образом, короткий ответ - то, что Вам нужен именованный канал для коммуникации между несвязанными процессами, которые не могли бы существовать одновременно.
/run
в настольной системе Linux Вы, вероятно, найдете несколько из (названными fifos и сокетами Unix). Это - форма IPC.
– goldilocks
25.03.2013, 14:10
Одно преимущество, не упомянутое в другом месте, состоит в том, что именованный канал может использоваться в местах, где только файл сделает.
Например, некоторые почтовые клиенты имеют функцию добавления содержания ~/.signature к каждому сообщению электронной почты. Если бы .signature были параметром командной строки или если бы почтовый клиент смог заметить, что .signature является исполняемым файлом и выполняет его, то Вам не был бы нужен именованный канал. Но если почтовый клиент не настолько сложен, можно сделать именованный канал названным .signature и запустить приложение, которое генерирует новую подпись каждый раз, когда файл читается.
Существует другое преимущество именованных каналов: можно использовать их через различные системы. Предположим, что Вы хотите связь в режиме реального времени два, обрабатывают работу различных машин. Затем совместно используйте папку между этими двумя, поместите Ваш FIFO на папку, и от Вас идут. Это значительно легче, чем преобразование приложения, разработанного для работы над файлами на службу, слушающую на порте.