Substitució de processos

De la Viquipèdia, l'enciclopèdia lliure
Un pipeline de tres programes que s'executen en un terminal de text

En informàtica, la substitució de processos és una forma de comunicació entre processos que permet que l'entrada o sortida d'una ordre aparegui com a fitxer. L'ordre es substitueix en línia, on normalment apareix un nom de fitxer, per l'intèrpret d'ordres. Això permet que els programes que normalment només accepten fitxers puguin llegir directament o escriure en un altre programa.[1]

Història[modifica]

La substitució del procés estava disponible com a opció en temps de compilació per a ksh88, la versió de 1988 del KornShell de Bell Labs.[2] L'intèrpret d'ordres rc proporciona la funció com a "pipeline branching" a la versió 10 d'Unix, publicada el 1990.[3] L'intèrpret d'ordres Bash va proporcionar la substitució del procés a tot tardar a la versió 1.14, publicada el 1994.[4]

Exemple[modifica]

Els exemples següents utilitzen la sintaxi de KornShell.

L'ordre Unix diff normalment accepta els noms de dos fitxers per comparar, o un nom de fitxer i una entrada estàndard. La substitució de processos permet comparar directament la sortida de dos programes:

$ diff <(sort file1) <(sort file2)

L'expressió <(command) diu a l'intèrpret d'ordres que executi l'ordre i que la seva sortida aparegui com a fitxer. L' ordre pot ser qualsevol ordre arbitràriament complexa de l'intèrpret d'ordres. Sense substitució de processos, les alternatives són:

  1. Desar la sortida de les ordres en un fitxer temporal i, a continuació, llegir els fitxers temporals.
    $ sort file2 > /tmp/file2.sorted
    $ sort file1 | diff - /tmp/file2.sorted
    $ rm /tmp/file2.sorted
    
  2. Crear una canonada amb nom (també coneguda com a FIFO), iniciar una ordre escrivint a la canonada amb nom en segon pla i, a continuació, executar l'altra ordre amb la canonada amb nom com a entrada.
    $ mkfifo /tmp/sort2.fifo
    $ sort file2 > /tmp/sort2.fifo &
    $ sort file1 | diff - /tmp/sort2.fifo
    $ rm /tmp/sort2.fifo
    

Les dues alternatives són més feixugues. La substitució de processos també es pot utilitzar per capturar la sortida que normalment aniria a un fitxer i redirigir-la a l'entrada d'un procés. La sintaxi de Bash per escriure en un procés és >(command). Aquí teniu un exemple amb les ordres tee, wc i gzip que compta les línies d'un fitxer amb wc -l i el comprimeix amb gzip d'una sola passada:

$ tee >(wc -l >&2) < bigfile | gzip > bigfile.gz

Mecanisme[modifica]

Sota el capó, la substitució de processos té dues implementacions. En sistemes que admeten /dev/fd (la majoria de sistemes semblants a Unix), funciona cridant a la crida al sistema pipe(), que retorna un descriptor de fitxer $fd per a una nova canonada anònima, i després crea la cadena /dev/fd/$fd, i el substitueix a la línia d'ordres. En sistemes sense suport /dev/fd, crida a mkfifo amb un nou nom de fitxer temporal per crear una canonada amb nom i substitueix aquest nom de fitxer a la línia d'ordres.

Referències[modifica]

  1. «Bash Process Substitution: How to Use it» (en anglès), 26-10-2020. [Consulta: 10 desembre 2023].
  2. Rosenblatt, Bill. «Appendix A.2». A: Learning the Korn Shell (en anglès). 2nd. O'Reilly & Associates, April 2002. ISBN 0-596-00195-9. 
  3. Duff, Tom. Rc — A Shell for Plan 9 and UNIX Systems (en anglès), 1990. 
  4. «Process Substitution (Bash Reference Manual)» (en anglès). [Consulta: 10 desembre 2023].