В комп’ютингу процесне заміщення - це форма взаємодії між процесами, яка дозволяє (ввід) та (вивід) представляти файлом. оболонка заміщує назву файлу викликом програми. Це дозволяє програмам, які зазвичай лише приймають файли, напряму читати або записувати результат в іншу програму.
Історія
Процесне заміщення було доступне для вибору при компіляції в ksh88
, KornShell версії 1988 року. RC оболонка подає цю можливість як “розгалуження конвеєру” в Version 10 Unix, випущеній в 1990 році. Bash shell запропонував таку можливість в версії 1.14 1994 року.
Приклади
Наступні приклади використовують KornShell синаксис.
Команда diff в Unix зазвичай приймає назви двох файлів, які треба порівняти, або один файл і стандатний ввід. Процесне заміщення дозволяє порівнювати вивід двох програм напряму:
$ diff <(sort file1) <(sort file2)
Вираз <(command)
вказує командному інтерпретатору виконати command і вивести вихідні дані файлом. Command може бути будь-якою командою оболонки довільної складності.
Альтернатива цьому, не використовуючи заміщення, виглядає наступним чином:
- Зберегти вивід команди в тимчасовий файл, тоді його зчитати
$ sort file2 > /tmp/file2.sorted $ sort file1 | diff - /tmp/file2.sorted $ rm /tmp/file2.sorted
- Створити іменований канал (також відомий як )), розпочати одну команду, що вводить в нього дані, у фоновому режимі, тоді виконати іншу команду, вхідними даними для якої слугуватиме цей іменований канал.
$ mkfifo /tmp/sort2.fifo $ sort file2 > /tmp/sort2.fifo & $ sort file1 | diff - /tmp/sort2.fifo $ rm /tmp/sort2.fifo
Обидві альтернативи є більш громіздкими. процесне заміщення можна також використовувати, щоб захопити вивід, який типово записувався би у файл, і перенаправити його на ввід іншому процесу. У оболонці Bash синтаксисом для запису в процес є >(команда). Ось приклад використання tee, wc та gzip команд, що рахують кількість стрічок у файлі командою wc -l
і стискає командою gzip
одним рядком:
$ tee >(wc -l >&2) < bigfile | gzip > bigfile.gz
Переваги
Основні переваги процесного заміщення над його альтернативою є:
- Простота: команди можна передавати вбудовано, немає потреби зберігати тимчасові файли і заздалегідь створювати іменовані канали.
- Продуктивність: читання безпосередньо з іншого процесу є часто швидшим, ніж запис тимчасового файлу на диск, а тоді зчитування його в потік наново.Це також економить пам’ять диску.
- Паралелізм: заміщений процес може виконуватись паралельно з командою, яка читає його вивід і передає дані на ввід, користуючись перевагами мультипроцесорності для зменшення загального часу компіляції.
Механізм роботи
Під капотом процесне заміщення має два шляхи виконання. В системах, що підтримують /dev/fd
(тобто більшість Unix-подібних систем) воно виконує системний виклик pipe()
, який повертає файловий дескриптор $fd
для неіменованого каналу, тоді створює рядок /dev/fd/$fd
і заміщує нею дані в командному рядку. В системах, де така директорія не підтримується, воно викликає mkfifo
з новою тимчасовою назвою файлу для створення іменованого каналу і заміщує дані в командному рядку цією назвою файлу. Для наочного прикладу наведених кроків, перегляньмо наступний приклад командного заміщення в системі, що підтримує/dev/fd
$ diff file1 <(sort file2)
Кроки, що виконує оболонка:
- Створити новий неіменований канал. До нього можна доступитися за
/dev/fd/63
або схожим шляхом. Перевірити можна командоюecho <(true)
. - Виконати командне заміщення у фоновому режимі (в даному випадку це команда
sort file2
), направивши його вивід в неіменований канал. - Виконати основну команду, замінюючи потрібну команду шляхом до неіменованого каналу. В цьому випадку повний вигляд команди буде приблизно наступним:
diff file1 /dev/fd/63
. - Коли виконання завершено, закрити неіменований канал.
Для іменованих каналів виконання відрізняється лише створенням на видаленням каналу: mkfifo
для створення та unlink
для видалення. Усі інші аспекти залишаються незмінними
Обмеження
Створенні “файли” не відслідковуються, тобто процес, що виконує читання та запис до файлу не має безпосереднього доступу до нього, він повинен зчитати чи записати файл від початку до кінця з першого разу. Програми, що явно перевіряють тип файлу перед його відкриттям, можуть не працювати з процесним заміщенням, тому що “файл”, який є результатом процесного заміщення не є звичайним файлом. До того ж, аж до Bash 4.4 (2016 року випуску) отримати код виходу з програми, створений самою оболонкою, було неможливо.
Див. також
Посилання
- Rosenblatt, Bill; Robbins, Arnold (April 2002). Appendix A.2. Learning the Korn Shell (вид. 2nd). O'Reilly & Associates. ISBN .
- Duff, Tom (1990). Rc — A Shell for Plan 9 and UNIX Systems. CiteSeerX 10.1.1.41.3287.
- Ramey, Chet (18 серпня 1994). Bash 1.14 release notes. Free Software Foundation. Available in the Gnu source archive of version 1.14.7 [ 4 березня 2016 у Wayback Machine.] as of 12 February 2016.
- . Greg's Wiki. 22 вересня 2016. Архів оригіналу за 11 листопада 2021. Процитовано 6 лютого 2021.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V komp yutingu procesne zamishennya ce forma vzayemodiyi mizh procesami yaka dozvolyaye vvid ta vivid predstavlyati fajlom obolonka zamishuye nazvu fajlu viklikom programi Ce dozvolyaye programam yaki zazvichaj lishe prijmayut fajli napryamu chitati abo zapisuvati rezultat v inshu programu IstoriyaProcesne zamishennya bulo dostupne dlya viboru pri kompilyaciyi v ksh88 KornShell versiyi 1988 roku RC obolonka podaye cyu mozhlivist yak rozgaluzhennya konveyeru v Version 10 Unix vipushenij v 1990 roci Bash shell zaproponuvav taku mozhlivist v versiyi 1 14 1994 roku PrikladiNastupni prikladi vikoristovuyut KornShell sinaksis Komanda diff v Unix zazvichaj prijmaye nazvi dvoh fajliv yaki treba porivnyati abo odin fajl i standatnij vvid Procesne zamishennya dozvolyaye porivnyuvati vivid dvoh program napryamu diff lt sort file1 lt sort file2 Viraz lt command vkazuye komandnomu interpretatoru vikonati command i vivesti vihidni dani fajlom Command mozhe buti bud yakoyu komandoyu obolonki dovilnoyi skladnosti Alternativa comu ne vikoristovuyuchi zamishennya viglyadaye nastupnim chinom Zberegti vivid komandi v timchasovij fajl todi jogo zchitati sort file2 gt tmp file2 sorted sort file1 diff tmp file2 sorted rm tmp file2 sortedStvoriti imenovanij kanal takozh vidomij yak rozpochati odnu komandu sho vvodit v nogo dani u fonovomu rezhimi todi vikonati inshu komandu vhidnimi danimi dlya yakoyi sluguvatime cej imenovanij kanal mkfifo tmp sort2 fifo sort file2 gt tmp sort2 fifo amp sort file1 diff tmp sort2 fifo rm tmp sort2 fifo Obidvi alternativi ye bilsh gromizdkimi procesne zamishennya mozhna takozh vikoristovuvati shob zahopiti vivid yakij tipovo zapisuvavsya bi u fajl i perenapraviti jogo na vvid inshomu procesu U obolonci Bash sintaksisom dlya zapisu v proces ye gt komanda Os priklad vikoristannya tee wc ta gzip komand sho rahuyut kilkist strichok u fajli komandoyu wc li stiskaye komandoyu gzip odnim ryadkom tee gt wc l gt amp 2 lt bigfile gzip gt bigfile gzPerevagiOsnovni perevagi procesnogo zamishennya nad jogo alternativoyu ye Prostota komandi mozhna peredavati vbudovano nemaye potrebi zberigati timchasovi fajli i zazdalegid stvoryuvati imenovani kanali Produktivnist chitannya bezposeredno z inshogo procesu ye chasto shvidshim nizh zapis timchasovogo fajlu na disk a todi zchituvannya jogo v potik nanovo Ce takozh ekonomit pam yat disku Paralelizm zamishenij proces mozhe vikonuvatis paralelno z komandoyu yaka chitaye jogo vivid i peredaye dani na vvid koristuyuchis perevagami multiprocesornosti dlya zmenshennya zagalnogo chasu kompilyaciyi Mehanizm robotiPid kapotom procesne zamishennya maye dva shlyahi vikonannya V sistemah sho pidtrimuyut dev fd tobto bilshist Unix podibnih sistem vono vikonuye sistemnij viklik pipe yakij povertaye fajlovij deskriptor fd dlya neimenovanogo kanalu todi stvoryuye ryadok dev fd fd i zamishuye neyu dani v komandnomu ryadku V sistemah de taka direktoriya ne pidtrimuyetsya vono viklikaye mkfifo z novoyu timchasovoyu nazvoyu fajlu dlya stvorennya imenovanogo kanalu i zamishuye dani v komandnomu ryadku ciyeyu nazvoyu fajlu Dlya naochnogo prikladu navedenih krokiv pereglyanmo nastupnij priklad komandnogo zamishennya v sistemi sho pidtrimuye dev fd diff file1 lt sort file2 Kroki sho vikonuye obolonka Stvoriti novij neimenovanij kanal Do nogo mozhna dostupitisya za dev fd 63 abo shozhim shlyahom Pereviriti mozhna komandoyuecho lt true Vikonati komandne zamishennya u fonovomu rezhimi v danomu vipadku ce komandasort file2 napravivshi jogo vivid v neimenovanij kanal Vikonati osnovnu komandu zaminyuyuchi potribnu komandu shlyahom do neimenovanogo kanalu V comu vipadku povnij viglyad komandi bude priblizno nastupnim diff file1 dev fd 63 Koli vikonannya zaversheno zakriti neimenovanij kanal Dlya imenovanih kanaliv vikonannya vidriznyayetsya lishe stvorennyam na vidalennyam kanalu mkfifo dlya stvorennya ta unlink dlya vidalennya Usi inshi aspekti zalishayutsya nezminnimiObmezhennyaStvorenni fajli ne vidslidkovuyutsya tobto proces sho vikonuye chitannya ta zapis do fajlu ne maye bezposerednogo dostupu do nogo vin povinen zchitati chi zapisati fajl vid pochatku do kincya z pershogo razu Programi sho yavno pereviryayut tip fajlu pered jogo vidkrittyam mozhut ne pracyuvati z procesnim zamishennyam tomu sho fajl yakij ye rezultatom procesnogo zamishennya ne ye zvichajnim fajlom Do togo zh azh do Bash 4 4 2016 roku vipusku otrimati kod vihodu z programi stvorenij samoyu obolonkoyu bulo nemozhlivo Div takozhKonveyeri Unix Imenovanij kanal Komandne zamishennya Neimenovanij kanalPosilannyaRosenblatt Bill Robbins Arnold April 2002 Appendix A 2 Learning the Korn Shell vid 2nd O Reilly amp Associates ISBN 0 596 00195 9 Duff Tom 1990 Rc A Shell for Plan 9 and UNIX Systems CiteSeerX 10 1 1 41 3287 Ramey Chet 18 serpnya 1994 Bash 1 14 release notes Free Software Foundation Available in the Gnu source archive of version 1 14 7 4 bereznya 2016 u Wayback Machine as of 12 February 2016 Greg s Wiki 22 veresnya 2016 Arhiv originalu za 11 listopada 2021 Procitovano 6 lyutogo 2021