Fer canonada ============ Es vol acabar de dissenyar un programa :file:`fer_canonada.py` que té tres paràmetres de línia que anomenarem *n* (enter), *etapa* (nom d'un programa), i *final* (nom d'un programa). Construeix un pipeline de *n-1* processos d'un programa *etapa* amb un darrer procés *final*. En total hi hauran *n* processos connectats. Si disposem del programa :file:`prova.py` següent: .. code:: python def prova(): enter=input() print(str(eval(enter+'+1'))) .. L'efecte de la comanda de línia següent és:: $ echo "0" | ./fer_canonada 10 ./prova ./prova 10 .. On :file:`prova` és un fitxer executable que crida el python3 per executar la funció :py:func:`prova` de :file:`prova.py`, i :file:`fer_canonada` el mateix per :file:`fer_canonada.py`. Gràficament, el que fa :file:`fer_canonada.py` és fer el següent diagrama de connexions: .. image:: canonada.svg :width: 75% :align: center Treballarem amb el mòdul :py:mod:`mòdul os ` per accedir al canal estàndard d'entrada i el de sortida que els tractarem com a fitxers oberts. Farem servir els descriptors o gestors de fitxers (:py:meth:`sys.*.fileno()`) del sistema en comptes dels que habitualment fa servir python. Usarem també les operacions :py:func:`read() `, :py:func:`write() `, :py:func:`pipe() `, :py:func:`fork() `, i :py:func:`execlp() `. .. literalinclude:: esborrany.py :language: python3 :lines: 3-21 La funció :py:func:`creaFilConnectat` bifurca un nou procés fent les següents connexions: - El primer paràmetre de la funció representa la sortida d'un pipe creat anteriorment i és l'índex a la taula d'E/S del procés. La sortida d'aquest pipe es connecta al canal estàndard d'entrada del nou procés bifurcat - i el canal estàndard de sortida de l'esmentat procés es connecta amb l'entrada d'un nou pipe creat del que la seva sortida quedarà per connectar més endavant. A més, la funció - Eliminarà les entrades de la taula d'E/S que no s'usaran tant pel procés pare com el fill. - El procés fill serà substituit per l'executable (segon paràmetre) - Retornarà la sortida del nou pipe per següents connexions. La figura següent il·lustra les connexions que fa: .. image:: pipes.svg :width: 75% :align: center i part del codi de la creació del fill connectat a un pipe és: .. literalinclude:: esborrany.py :language: python3 :lines: 24-55 Copieu el fitxer :download:`esborrany.py` en el fitxer :file:`fer_canonada.py`, i: 1- Completeu la part que fa possible les connexions del nou procés bifurcat entre dos pipes creats abans. 2- Completeu la part de codi encarregada de substituir el nou procés per la comanda *executable*. 3- Completeu la resta de codi: programa principal que llegeix els arguments de la línia, fitxer executable :file:`fer_canonada` que executa la funció principal de :file:`fer_canonada.py`. Dissenyar l'executable :file:`prova` que executa la funció :py:func:`prova` de file:`prova.py` i comprovar l'exemple d'execució donat.